Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更换一个线程需要多长时间;Java中的优先权是什么?_Java_Multithreading_Scheduler - Fatal编程技术网

更换一个线程需要多长时间;Java中的优先权是什么?

更换一个线程需要多长时间;Java中的优先权是什么?,java,multithreading,scheduler,Java,Multithreading,Scheduler,我找不到任何关于更改线程优先级是否是一项代价高昂的操作的陈述,从时间上看。我想经常这样做,但如果每次切换都会带来严重的时间损失,那么可能就不值得麻烦了 我找不到任何关于更改线程优先级是否是一项代价高昂的操作的陈述,从时间上看。我想经常这样做,但如果每次切换都会带来严重的时间损失,那么可能就不值得麻烦了 这里的任何答案都将非常依赖于操作系统。我怀疑对于大多数Unix变体来说,答案是否定的,它并不昂贵。它可能需要某种类型的数据同步,但除此之外,它只是在线程的管理信息上设置一个值。我怀疑没有如评论中所

我找不到任何关于更改线程优先级是否是一项代价高昂的操作的陈述,从时间上看。我想经常这样做,但如果每次切换都会带来严重的时间损失,那么可能就不值得麻烦了

我找不到任何关于更改线程优先级是否是一项代价高昂的操作的陈述,从时间上看。我想经常这样做,但如果每次切换都会带来严重的时间损失,那么可能就不值得麻烦了

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

也就是说,在不了解您的特定用例的情况下,我怀疑它是否值得费心。正如我在下面列出的答案中所说的,线程优先级的唯一区别在于,如果所有线程都完全受CPU限制,并且您希望一个或另一个任务获得更多的周期

此外,线程优先级是非常非线性的,对它们的微小更改可能几乎没有影响,因此设置线程优先级所产生的任何开销都将压倒更改线程优先级所获得的任何好处

请看我的回答:

另外,请查看这篇关于它们的文章,并在Linux下对它们进行一些实际测试。引述:

可以看出,线程优先级1-8最终占据了几乎相等的CPU份额,而优先级9和10占据了更大的份额(尽管9和10之间基本上没有区别)。测试的版本是Java6Update10


在Windows的情况下,调用SetThreadPriority来更改准备运行线程的优先级是一个系统调用,它会将线程从当前的优先级就绪队列移动到另一个优先级就绪队列,这比仅在thread对象中设置某个值的成本更高

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

此处提到了就绪队列:

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

我在MSDN论坛上问过这个问题。第四篇帖子与我在第一篇和第三篇帖子中提到的顺序一致:


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



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

线程优先级只是系统调度器关于如何处理线程之间CPU时间的建议。设置优先级与设置一个变量(可能通过JNA)一样昂贵。更改的优先级将在下次交易发生后生效,所以更改需要多长时间才能生效尚未确定。如果频繁更改优先级,则可能会出现这样的情况:下一次更改发生在最后一次更改产生任何影响之前。@M.Prokhorov-如果某个线程的优先级更改为高于当前运行的任何线程,则当前优先级更高的线程将立即开始运行,如果核心当前没有空闲,这将导致立即切换上下文。@rcgldr,我认为这是个轶事。并没有说设置优先级必须触发重新调度操作。至少与JDK中的线程文档没有什么相似之处。也就是说,如果线程将立即运行,那么这是一个相对昂贵的操作,因为这需要上下文切换。出于好奇,您希望通过频繁更改线程优先级来解决什么问题?@M.Prokhorov-更改准备运行线程的优先级:WIndows-移动节点(删除、插入)从一个优先级索引运行队列到另一个优先级索引运行队列的节点;Linux(当前版本)在红黑树中移动节点(删除、插入)。对于Windows和Linux,由于优先级更改(不是在下一个时间段),可能会发生抢占。非sequitur。没有任何信息表明高优先级线程将立即开始运行。它明确指出,当“具有更高优先级的线程已准备好运行”时,会发生上下文切换。语句“将其移动到更高优先级的就绪队列”与语句“立即运行”不一致。如果新就绪队列中已经有线程,它将首先运行,如果有优先级更高的就绪线程,它将在此之前运行,或者继续运行。因此,确定您的答案,并提供ci