线程内线程的优先级

whe*_*els 6 java concurrency multithreading

假设你有启动两个线程的程序ab,并b开始了自己的另外十个线程.是否a会获得一半可用的"注意力"而b它的线程共享另一半,或者它们是否共享?如果答案是默认的后者,你怎么能实现前者?谢谢!

NIN*_*OOP 5

关于这个主题有很多很好的文档.其中之一就是这个.

创建Java线程时,它会从创建它的线程继承其优先级.您还可以使用setPriority()方法在创建线程后随时修改线程的优先级.线程优先级是MIN_PRIORITYMAX_PRIORITY(Thread类中定义的常量)之间的整数.整数越高,优先级越高.在任何给定时间,当准备好执行多个线程时,运行时系统选择具有最高优先级的"Runnable"线程来执行.只有当该线程因某种原因停止,产生或变为"不可运行"时,优先级较低的线程才会开始执行.如果两个具有相同优先级的线程正在等待CPU,则调度程序选择其中一个以循环方式运行.选定的线程将运行,直到满足下列条件之一:

  1. 优先级较高的线程变为"Runnable".
  2. 它会产生,或者它的run()方法退出.
  3. 在支持时间分片的系统上,其时间分配已过期.

在任何给定时间,最高优先级的线程正在运行.但是,这不能保证.线程调度程序可以选择运行较低优先级的线程以避免饥饿.因此,出于效率目的,仅将优先级用于影响调度策略.不要依赖线程优先级来保证算法的正确性.


Ste*_*n C 2

是否a收到一半的可用“注意力”,b而其线程共享另一半,或者它们都平等共享?

两者都不。每个线程接收的时间比例是未指定的,并且在Java中没有可靠的方法来控制它。这取决于本机线程调度程序。

如果默认答案是后者,那么如何实现前者呢?

你不能,可靠地。

唯一需要影响每个线程运行的相对时间的是线程优先级。即使它们也是不可靠或可预测的。javadoc 只是说高优先级线程“优先于”低优先级线程执行。实际上,这取决于本机线程调度程序如何处理优先级。

有关更多详细信息:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/thread-priorities.html ...其中包括有关一系列平台和 Java 版本上的线程优先级的信息。