在说20核心机器上的大约150个线程中。我希望特定的线程永远不会被上下文切换。我不确定将线程优先级设置为MAX_PRIORITY会不会这样做?另外,如果我们将优先级设置为max,那么操作系统是否必须遵循指令(假设我在sudo模式下运行)?
答案 0 :(得分:4)
您不能完全禁用线程上下文切换,但是通过将线程优先级设置为MAX_PRIORITY
,您可以告诉操作系统线程调度程序(如果它支持优先级调度策略)以抢占较低级别优先级线程,如果优先级较高的线程已准备好运行。
java.lang.Thread Javadoc
每个帖子都有优先权。执行具有更高优先级的线程 优先于优先级较低的线程。
https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
Linux内核线程调度程序API手册页
优先级:
从概念上讲,调度程序维护一个可运行线程列表 每个可能的sched_priority值。为了确定哪个 线程运行接下来,调度程序查找非空列表 最高静态优先级,并选择此处的线程 列表。
先发制人:
所有调度都是抢占式的:如果一个线程具有更高的静态 优先级准备好运行,当前运行的线程将是 抢占并返回等待列表以获取其静态优先级 水平。
答案 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。这将确保您想要的线程在您希望它运行时随时运行。这本质上就像它从不进行上下文切换。这应该可以解决您的问题。