在Java中更改线程的优先级需要多长时间?

时间:2017-06-05 17:38:28

标签: java multithreading scheduler

我找不到的是关于是否在时间上更改线程优先级是一项代价高昂的操作的任何声明。我想经常这样做,但如果每个开关都有很长的时间损失,那么可能不值得这么麻烦。

2 个答案:

答案 0 :(得分:1)

  

我找不到的是关于是否在时间上更改线程优先级是一项代价高昂的操作的任何声明。我想经常这样做,但如果每个开关都有很长的时间损失,那么可能不值得这么麻烦。

这里的任何答案都将取决于操作系统。我怀疑大多数Unix变种的答案都是否定的,它并不昂贵。它可能需要某种数据同步,但除此之外它只是在线程的管理信息上设置一个值。我怀疑没有像评论中讨论的那样重新安排线程。

那就是说,在不了解您的特定用例的情况下,我怀疑这是值得的。正如我在下面列出的答案中所说的那样,线程优先级划分唯一的时间就是如果所有线程完全受CPU限制,并且您希望一个或另一个任务获得更多周期。

此外,线程优先级非常非线性,对它们的小改动可能几乎没有效果,因此设置线程优先级所产生的任何开销都将超过通过更改它们所带来的任何好处。

请在此处查看我的回答: Guide for working with Linux thread priorities and scheduling policies?

另外,请查看这篇文章,了解Java thread priorities以及Linux下的一些实际测试。引用:

  

可以看出,线程优先级1-8的CPU占用率几乎相等,而优先级9和10的份额要大得多(尽管9和10之间基本没有区别)。测试的版本是Java 6 Update 10。

答案 1 :(得分:-1)

对于Windows,调用SetThreadPriority来更改准备运行线程的优先级是一个系统调用,它将线程从其当前优先级就绪队列移动到另一个优先级就绪队列,比在线程对象中设置一些值更昂贵。

如果使用SetThreadPriority来增加线程的优先级,并且如果这导致现在更高优先级的线程抢占更低优先级的线程,则抢占发生在调用时,而不是在下一个时间片。

这里提到了就绪队列:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682105(v=vs.85).aspx

此处提到了与优先级更改相关的上下文切换:"以下事件可能需要线程调度... 线程的优先级更改,或者是因为系统服务调用,还是因为Windows本身改变了优先级值。"和" Preemption ...当优先级较高的线程准备好运行时,优先级较低的线程被抢占。出现这种情况可能有以下几种原因:优先级较高的线程等待完成... 线程优先级增加或减少。"还提到了就绪队列:" Windows多处理器系统具有每处理器调度程序准备好的队列"

https://www.microsoftpressstore.com/articles/article.aspx?p=2233328&seqNum=7

我在MSDN论坛上询问了这个问题。第四篇文章同意我在第一篇和第三篇文章中提到的序列:

https://social.msdn.microsoft.com/Forums/en-US/d4d40f9b-bfc9-439f-8a76-71cc5392669f/setthreadpriority-to-higher-priority-is-context-switch-immediate?forum=windowsgeneraldevelopmentissues

对于当前版本的Linux,按优先级编制索引的运行队列被红黑树替换。更改线程的优先级将涉及在红黑树中删除和重新插入线程对象。如果线程对象被充分移动到" left"则会发生抢占。红黑树。

https://www.ibm.com/developerworks/library/l-completely-fair-scheduler

响应有关应用程序的评论"检查传入蓝牙数据包的全速流",接收线程应该是最高优先级,希望在等待时花费大部分时间不运行收到一个包。高优先级数据包将排队等待由优先级低于接收线程的另一个线程处理。如果需要,多个处理线程可以利用多个核心。