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

时间:2016-06-11 15:03:55

标签: java linux multithreading operating-system

在说20核心机器上的大约150个线程中。我希望特定的线程永远不会被上下文切换。我不确定将线程优先级设置为MAX_PRIORITY会不会这样做?另外,如果我们将优先级设置为max,那么操作系统是否必须遵循指令(假设我在sudo模式下运行)?

4 个答案:

答案 0 :(得分:4)

您不能完全禁用线程上下文切换,但是通过将线程优先级设置为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

答案 1 :(得分:2)

MAX_PRIORITY的线程优先级是否会这样做?

这取决于您的操作系统。虽然你设置了它,但没有保证调度程序会像那样工作。

答案 2 :(得分:2)

通常无法强制执行此操作。

例如,虚拟机可以选择150个线程中的所有其他线程,并在您最喜欢的线程之前运行它们。

我最喜欢的Kathy Sierra引用:

  

在JAVA中,谈到线程,保证很少

http://albertomorales.eu/in-java-when-it-comes-to-threads-very-little-is-guaranteed/

答案 3 :(得分:1)

您应该将线程优先级设置为 MAX_PRIORITY。这将确保您想要的线程在您希望它运行时随时运行。这本质上就像它从不进行上下文切换。这应该可以解决您的问题。