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