繁体   English   中英

线程内线程的优先级

[英]Prioritization of threads within threads

假设你有一个程序启动两个线程ab ,而b启动另外十个自己的线程。 难道a收到一半的可用的“关注”,而b和它的线程共享的另一半,还是他们都平等地分担? 如果答案是默认的后者,你怎么能实现前者? 谢谢!

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

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

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

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

难道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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM