2013-04-30 163 views
6

假设您有一个程序启动两个线程ab,并且b启动另外10个线程。 a是否获得了“关注”的一半,而b及其线索分享另一半,还是他们都平等分享?如果默认情况下答案是后者,你怎么能达到前者?谢谢!线程内线程的优先级

回答

2

是否a收到可用“注意”的一半,而b及其线程共享的另一半,还是他们都平等地分担?

都没有。每个线程收到的时间比例是未指定的,并且没有可靠的方法来在Java中进行控制。这取决于本地线程调度程序。

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

你不能,可靠。

您必须影响每个线程运行的相对时间量的唯一因素是线程优先级。即使它们不可靠或不可预测。 javadoc简单地说高优先级的线程被执行“优先于”低优先级的线程。实际上,这取决于本地线程调度程序如何处理优先级。

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

+0

向下选民 - 你愿意解释吗? – 2013-04-30 13:16:58

5

关于此主题有很多不错的文档。其中一个是this

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

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

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

+0

+1,'不要依赖线程优先级为算法的正确性'。 – 2013-04-30 11:05:55

+0

+1经典解释 – 2013-05-01 08:33:08

0

我们不能说线程将执行的顺序。线程调度程序按照我们无法改变的内置算法工作。线程调度程序从可运行池中选取任何线程(最高优先级线程)并使其运行。 我们只能提到调度程序应该处理我们的线程的优先级。