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