假设您有一个程序启动两个线程a
和b
,并b
启动另外十个自己的线程。是否a
收到一半的可用“关注”,b
而其线程共享另一半,还是它们都平等共享?如果默认情况下答案是后者,那么如何实现前者呢?谢谢!
3 回答
关于这个主题有很多很好的文档。这样的一个。
创建 Java 线程时,它会从创建它的线程继承其优先级。您还可以在创建线程后随时使用setPriority()方法修改线程的优先级。线程优先级是介于MIN_PRIORITY和MAX_PRIORITY之间的整数(在 Thread 类中定义的常量)。整数越高,优先级越高。在任何给定时间,当多个线程准备好执行时,运行时系统会选择具有最高优先级的“可运行”线程来执行。只有当该线程由于某种原因停止、产生或变为“不可运行”时,较低优先级的线程才会开始执行。如果两个具有相同优先级的线程正在等待 CPU,调度程序会选择其中一个以循环方式运行。所选线程将一直运行,直到满足以下条件之一:
- 更高优先级的线程变为“可运行”。
- 它产生,或者它的 run() 方法退出。
- 在支持时间片的系统上,其时间分配已过期。
在任何给定时间,最高优先级的线程都在运行。但是,这不能保证。线程调度程序可以选择运行较低优先级的线程以避免饥饿。因此,出于效率目的,仅使用优先级来影响调度策略。不要依赖线程优先级来保证算法的正确性。
是否
a
收到一半的可用“关注”,b
而其线程共享另一半,还是它们都平等共享?
两者都不。每个线程接收的时间比例是未指定的,Java中没有可靠的方法来控制它。这取决于本机线程调度程序。
如果默认情况下答案是后者,那么如何实现前者呢?
你不能,可靠。
您必须影响每个线程运行的相对时间量的唯一因素是线程优先级。甚至它们也不可靠或不可预测。javadocs只是说“优先于”低优先级线程执行高优先级线程。在实践中,这取决于本机线程调度程序如何处理优先级。
有关更多详细信息: http: //docs.oracle.com/javase/7/docs/technotes/guides/vm/thread-priorities.html ...其中包括有关一系列平台和 Java 版本上的线程优先级的信息。
不能肯定地说线程将执行的顺序。线程调度程序按照我们无法更改的内置算法工作。线程调度程序从可运行池中提取任何线程(最高优先级线程)并使其运行。我们只能提到调度程序应该处理我们的线程的优先级。