当前位置: 技术问答>java相关
请问一个线程的优先级增加能使线程停止执行吗?
来源: 互联网 发布时间:2015-03-28
本文导语: | 这个问题很麻烦,涉及的太多了。 实际上线程的调度是和操作系统相关的,这一点上java并不能做到完全的跨平台。在一个协作式的线程调度平台上,增加一个线程的优先级对于线程调度可能没有任何作用,但是...
|
这个问题很麻烦,涉及的太多了。
实际上线程的调度是和操作系统相关的,这一点上java并不能做到完全的跨平台。在一个协作式的线程调度平台上,增加一个线程的优先级对于线程调度可能没有任何作用,但是对于抢占式调度平台而言,增加一个线程的优先级的效果就是立杆见影了。典型的协作式调度平台就是win3.2到win98,nt和98以上版本的windows基本上都是两种结合的(即协作式和抢占式的混合),而solaris的绿色线程模型则是完全的抢占式的。java中的优先级有十种之多,但是目前没有那个操作系统有这么多的优先级,大多就是三种,因此,如果是将优先级提高一级,在抢占式线程平台下也不一定有效果,因此目前使用线程优先级的策略是尽量不用,而是通过在必要的时候使用sleep或者wait方法阻塞你要抢占的其它线程,执行完后再唤醒他们。如果必须用,那么只用三种,普通级、最高级和最低级。使用十级优先级别在大部分情况下没有任何意义。
实际上线程的调度是和操作系统相关的,这一点上java并不能做到完全的跨平台。在一个协作式的线程调度平台上,增加一个线程的优先级对于线程调度可能没有任何作用,但是对于抢占式调度平台而言,增加一个线程的优先级的效果就是立杆见影了。典型的协作式调度平台就是win3.2到win98,nt和98以上版本的windows基本上都是两种结合的(即协作式和抢占式的混合),而solaris的绿色线程模型则是完全的抢占式的。java中的优先级有十种之多,但是目前没有那个操作系统有这么多的优先级,大多就是三种,因此,如果是将优先级提高一级,在抢占式线程平台下也不一定有效果,因此目前使用线程优先级的策略是尽量不用,而是通过在必要的时候使用sleep或者wait方法阻塞你要抢占的其它线程,执行完后再唤醒他们。如果必须用,那么只用三种,普通级、最高级和最低级。使用十级优先级别在大部分情况下没有任何意义。
|
不过我也觉得B好象不对,因为虽然优先级别高的线程将被一直运行,但它好象不会终止已经运行的线程!
|
我认为是ABC
从Java的优先级定义中,JVM应该屏蔽底层实现细节,并保证priority
起作用,所以当另一个Thread的priority上升之后,这一行为会“加速”
使本Thread“更倾向于”被“挂起”(但并不保证何时“挂起”)
但从目前不同JVM的不同实现来看,priority调度的支持不太好,
使用了Java priority调度机制的代码实际上不是“跨平台”的。
所以Joshua Bloch大侠在"Effective Java"一书中建议最好不要使用
Java中的priority调度机制(基于类似原因,另外他还建议不要用ThreadGroup)。
从Java的优先级定义中,JVM应该屏蔽底层实现细节,并保证priority
起作用,所以当另一个Thread的priority上升之后,这一行为会“加速”
使本Thread“更倾向于”被“挂起”(但并不保证何时“挂起”)
但从目前不同JVM的不同实现来看,priority调度的支持不太好,
使用了Java priority调度机制的代码实际上不是“跨平台”的。
所以Joshua Bloch大侠在"Effective Java"一书中建议最好不要使用
Java中的priority调度机制(基于类似原因,另外他还建议不要用ThreadGroup)。