Java:确保线程永远不会被上下文切换

5

在大约20核心的机器上有约150个线程。我希望特定的线程永远不会发生上下文切换。我不确定将线程优先级设置为MAX_PRIORITY是否能够实现这一点。另外,如果我们将优先级设置为最高,操作系统是否会遵循这个指令(假设我以sudo模式运行)?


操作系统在Java线程基础方面并不起主要作用。 - mjn
4个回答

5

您不能完全禁用线程上下文切换,但是通过将线程优先级设置为MAX_PRIORITY,您告诉操作系统线程调度程序(如果它支持优先级调度策略)在更高优先级的线程准备好运行时抢占较低优先级的线程。

参考资料

java.lang.Thread Javadoc

每个线程都有一个优先级。具有较高优先级的线程优先于具有较低优先级的线程执行。

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html

Linux内核线程调度器API手册页

关于优先级:

从概念上讲,调度程序维护每个可能的sched_priority值的可运行线程列表。为了确定下一个运行的线程,调度程序查找具有最高静态优先级的非空列表,并选择该列表头部的线程。

关于抢占:

所有调度都是可以抢占的:如果具有更高静态优先级的线程准备好运行,则当前正在运行的线程将被抢占并返回到其静态优先级等待列表中。

http://man7.org/linux/man-pages/man7/sched.7.html


操作系统线程规范不相关 - Java虚拟机规范才是关键。 - mjn

2

将线程优先级设置为MAX_PRIORITY能够实现这个目的吗?

这取决于您的操作系统。尽管您设置了它,但不能保证调度程序会按照您的要求工作。


2

1
你应该将线程优先级设置为MAX_PRIORITY。这将确保您想要运行的线程在您希望它运行时运行。这基本上就像从未进行上下文切换一样。这应该解决您的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接