在大约20核心的机器上有约150个线程。我希望特定的线程永远不会发生上下文切换。我不确定将线程优先级设置为MAX_PRIORITY是否能够实现这一点。另外,如果我们将优先级设置为最高,操作系统是否会遵循这个指令(假设我以sudo模式运行)?
在大约20核心的机器上有约150个线程。我希望特定的线程永远不会发生上下文切换。我不确定将线程优先级设置为MAX_PRIORITY是否能够实现这一点。另外,如果我们将优先级设置为最高,操作系统是否会遵循这个指令(假设我以sudo模式运行)?
您不能完全禁用线程上下文切换,但是通过将线程优先级设置为MAX_PRIORITY
,您告诉操作系统线程调度程序(如果它支持优先级调度策略)在更高优先级的线程准备好运行时抢占较低优先级的线程。
java.lang.Thread Javadoc
每个线程都有一个优先级。具有较高优先级的线程优先于具有较低优先级的线程执行。
https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
Linux内核线程调度器API手册页
关于优先级:
从概念上讲,调度程序维护每个可能的sched_priority值的可运行线程列表。为了确定下一个运行的线程,调度程序查找具有最高静态优先级的非空列表,并选择该列表头部的线程。
关于抢占:
所有调度都是可以抢占的:如果具有更高静态优先级的线程准备好运行,则当前正在运行的线程将被抢占并返回到其静态优先级等待列表中。
将线程优先级设置为MAX_PRIORITY能够实现这个目的吗?
这取决于您的操作系统。尽管您设置了它,但不能保证调度程序会按照您的要求工作。
一般情况下,这是不可能实现的。
例如,虚拟机可以选择在您最喜欢的线程之前运行150个线程中的每一个其他线程。
我最喜欢的Kathy Sierra名言:
在JAVA中,当涉及到线程时,很少有什么是保证的。
http://albertomorales.eu/in-java-when-it-comes-to-threads-very-little-is-guaranteed/