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