Main.java:具有最高优先级的Java线程没有得到执行
public class Main {
public static void main(String[] args) {
final Semaphore semp = new Semaphore(1);
for (int facultyNO = 1; facultyNO <= 10; facultyNO++) {
final int NO = facultyNO;
Runnable run = new Runnable() {
public void run() {
try {
while (true) {
semp.acquire();
System.out.println("No." + NO + " grab a candy");
Bowl.candy--;
System.out.println("Candy num left:" + Bowl.candy);
semp.release();
Thread.sleep((long) (1000));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread faculty = new Thread(run);
faculty.setPriority(Thread.MIN_PRIORITY);
faculty.start();
}
Thread TA = new Thread(() -> {
try {
while (true) {
if (Bowl.candy < 0) {
semp.acquire();
System.out.println("TA fills the candy bowl");
Bowl.candy = 10;
System.out.println("Candy num left:" + Bowl.candy);
semp.release();
}
}
}catch (InterruptedException e) {
e.printStackTrace();
}
});
TA.setPriority(Thread.MAX_PRIORITY);
TA.start();
}
}
Bowl.java:
public class Bowl {
static int candy = 10;
}
我给线程 “TA” 最高优先级,因为我希望它只要Bowl.candy = 0就可以立即执行以填充碗。但是,控制台打印:
No.2 grab a candy
Candy num left:9
No.1 grab a candy
Candy num left:8
No.4 grab a candy
Candy num left:7
No.6 grab a candy
Candy num left:6
No.7 grab a candy
Candy num left:5
No.8 grab a candy
Candy num left:4
No.3 grab a candy
Candy num left:3
No.5 grab a candy
Candy num left:2
No.10 grab a candy
Candy num left:1
No.9 grab a candy
Candy num left:0
No.2 grab a candy
Candy num left:-1
No.1 grab a candy
Candy num left:-2
No.4 grab a candy
Candy num left:-3
No.6 grab a candy
Candy num left:-4
No.7 grab a candy
Candy num left:-5
No.8 grab a candy
Candy num left:-6
No.3 grab a candy
Candy num left:-7
No.5 grab a candy
Candy num left:-8
No.10 grab a candy
Candy num left:-9
No.9 grab a candy
Candy num left:-10
好像if (Bowl.candy < 0)
从未得到执行中的代码。为什么?
线程优先级不是操作系统调度程序遵循的硬规则。如果你有线程间依赖性(就像一个线程应该在其他线程之前执行)那么基本上你不需要线程。线程专门处理计算可以独立完成的事实。如果您正在寻找线程之间的共享状态,则需要使用其他并发机制。这可能会帮助你更多http://stackoverflow.com/questions/8811535/inconsistent-results-with-java-threads – kosa