第23天 线程的调度问题(优先级)
2016-11-21 19:43
211 查看
线程的生命周期:线程从创建到死亡的过程称为线程的一个”生命周期“。在某个时间点上,线程具有不同的状态,主要有以下四种状态:
1.创建状态
2.可执行状态
3.非可执行状态
4.终止状态
下面对这几个状态解释一下:
1.创建状态
当使用线程类的构造函数创建某个线程类的对象时,线程处于”创建状态“,在调用了对象的start()方法后,线程进入了可执行状态。
2.可执行状态
在线程序进入”可执行“状态后,如果系统的CPU空闲,则线程就可以直接投入执行了,在线程运行时,如果调用线程的wait()方法或者是sleep()方法,则线程进入了”非可执行状态“,此时系统的CPU不再分配时间片给该线程。
3.非可执行状态
在线程序进入”非可执行“状态后,可以调用线程的nofity()方法或者notifyall()方法、interrupt()方法再次进入”可执行“状态。
4.终止状态
当线程的run()方法执行结束后,线程自动消亡,该线程占用的系统资源会自动释放。该线程的整个生命周期就此结束。
线程总是存在优先级,优先级范围在1~10之间。JVM线程调度程序是基于优先级的抢先调度机制。在大多数情况下,当前运行的线程优先级将大于或等于线程池中任何线程的优先级。
注意:当设计多线程应用程序的时候,一定不要依赖于线程的优先级。因为线程调度优先级操作是没有保障的,只能把线程优先级作用作为一种提高程序效率的方法,但是要保证程序不依赖这种操作。
当线程池中线程都具有相同的优先级,调度程序的JVM实现自由选择它喜欢的线程。这时候调度程序的操作有两种可能:一是选择一个线程运行,直到它阻塞或者运行完成为止。二是时间分片,为池内的每个线程提供均等的运行机会。
设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。
可以通过setPriority(int newPriority)更改线程的优先级。例如:
Thread t = new MyThread();
t.setPriority(7);
t.start();
线程优先级为1~10之间的正整数,JVM从不会改变一个线程的优先级。然而,1~10之间的值是没有保证的。一些JVM可能不能识别10个不同的值,而将这些优先级进行每两个或多个合并,变成少于10个的优先级,则两个或多个优先级的线程可能被映射为一个优先级。
线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:
MAX_PRIORITY
线程的最高优先级。代表常量10
MIN_PRIORITY
线程的最低优先级。代表常量1
NORM_PRIORITY
线程的默认优先级。代表常量5
1.创建状态
2.可执行状态
3.非可执行状态
4.终止状态
下面对这几个状态解释一下:
1.创建状态
当使用线程类的构造函数创建某个线程类的对象时,线程处于”创建状态“,在调用了对象的start()方法后,线程进入了可执行状态。
2.可执行状态
在线程序进入”可执行“状态后,如果系统的CPU空闲,则线程就可以直接投入执行了,在线程运行时,如果调用线程的wait()方法或者是sleep()方法,则线程进入了”非可执行状态“,此时系统的CPU不再分配时间片给该线程。
3.非可执行状态
在线程序进入”非可执行“状态后,可以调用线程的nofity()方法或者notifyall()方法、interrupt()方法再次进入”可执行“状态。
4.终止状态
当线程的run()方法执行结束后,线程自动消亡,该线程占用的系统资源会自动释放。该线程的整个生命周期就此结束。
线程总是存在优先级,优先级范围在1~10之间。JVM线程调度程序是基于优先级的抢先调度机制。在大多数情况下,当前运行的线程优先级将大于或等于线程池中任何线程的优先级。
注意:当设计多线程应用程序的时候,一定不要依赖于线程的优先级。因为线程调度优先级操作是没有保障的,只能把线程优先级作用作为一种提高程序效率的方法,但是要保证程序不依赖这种操作。
当线程池中线程都具有相同的优先级,调度程序的JVM实现自由选择它喜欢的线程。这时候调度程序的操作有两种可能:一是选择一个线程运行,直到它阻塞或者运行完成为止。二是时间分片,为池内的每个线程提供均等的运行机会。
设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。
可以通过setPriority(int newPriority)更改线程的优先级。例如:
Thread t = new MyThread();
t.setPriority(7);
t.start();
线程优先级为1~10之间的正整数,JVM从不会改变一个线程的优先级。然而,1~10之间的值是没有保证的。一些JVM可能不能识别10个不同的值,而将这些优先级进行每两个或多个合并,变成少于10个的优先级,则两个或多个优先级的线程可能被映射为一个优先级。
线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:
MAX_PRIORITY
线程的最高优先级。代表常量10
MIN_PRIORITY
线程的最低优先级。代表常量1
NORM_PRIORITY
线程的默认优先级。代表常量5
相关文章推荐
- 线程调度的问题:Lock Convoy(锁封护)与Priority Inversion(优先级反转)
- 线程的调度和优先级问题
- 串口接收线程退出与优先级问题
- 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七
- Linux下线程的调度策略与优先级(一)
- Windows via C/C++ 学习(15)线程调度、线程优先级和亲缘性
- Java线程:线程的调度-优先级
- 线程的调度,优先级和亲缘性
- linux下线程优先级(属性) (当前线程的调度策略(是否允许设置优先级)。允许的最大优先级,最小优先级。如何设定优先级)
- 线程的调度问题
- JAVA线程之二:线程的调度及优先级
- Linux调度策略及线程优先级设置
- 第七章 线程的调度、优先级和亲缘性(4)
- 两个线程,一音/一视频udp数据包,优先级问题,在线等!
- 两个线程,一音/一视频udp数据包,优先级问题,在线等!
- Windows核心编程学习笔记 第二部分 完成编程任务 第7章 线程的调度 优先级 亲缘性
- 线程的调度、优先级和亲缘性
- 第七章 线程的调度、优先级和亲缘性(7)
- Windows高级编程之线程调度、优先级和亲缘性
- 限制线程优先级和调度