在调度线程执行时,是否有关于JVM的公平性的假设?
对于以下代码段,是否可以只执行“代码A”,忽略B?
public static void main(String args[]) {
new Thread() {
public void run() {
for (;;) { /* code A */ }
}
}.start();
new Thread() {
public void run() {
for (;;) { /* code B */ }
}
}.start();
}
问题更多的是理论问题 - 让我们假设这两个线程都没有被阻塞,或者鼓励调度程序切换上下文。
答案 0 :(得分:2)
在调度线程执行时,是否有关于JVM的公平性的假设?
没有
对于以下代码段,是否可以使用"代码A"只执行,B被忽略?
理论上是的。
在实践中:
如果有一个(可用的)核心,我希望操作系统级别的线程调度程序对线程进行时间分片,以便它们各自在日志条件中获得大约50%的可用时间
如果有多个(可用)核心,我希望这两个线程并行运行。
请注意,JLS或JVM规范都没有说明有关线程调度或公平性的任何信息。 Thread
的javadoc也没有。
据我所知,提到公平性的唯一Java API是ReentrantLock
API(javadoc),其中有一个构造函数参数,用于创建具有公平策略的锁。这意味着调度程序支持在锁上等待时间最长的线程。但即便如此也是如此:
"但请注意,锁的公平性并不能保证线程调度的公平性。"