下面的代碼存在於「UnderStanding the JVM Advanced Features and Best Practices,second Edition」的第13章中。 但是當線程執行「while(Thread.activeCount()> 1)」時,它將被阻塞並且不會打印任何內容。爲什麼線程在執行代碼時被阻塞「while(Thread.activeCount()> 1)」?
public class Code_12_1 {
public static AtomicInteger race = new AtomicInteger(0);
public static void increment(){
race.incrementAndGet();
}
private static final int THREADS_COUNT = 20;
public static void main(String[] args) throws Exception{
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
increment();
}
}
});
threads[i].start();
}
while (Thread.activeCount() > 1)
Thread.yield();
System.out.println(race);
}
}
但是,當我改變 「而(Thread.activeCount()> 1)」 到 「而(Thread.activeCount()> 2)」 的線程可以正確地執行和輸出的答案200000.
那麼,爲什麼線程在執行時會被阻塞「while(Thread.activeCount()> 1)」?
您沒有爲您的線程指定一個組,以便它由JVM分配,而且似乎使用的組已在您創建的線程之上有一個正在運行的線程。 – assylias
java doc中的'activeCount'方法:「返回的值只是一個估計值,因爲線程數可能會動態變化,而此方法會遍歷內部數據結構,並且可能會受到某些系統線程的影響。用於調試和監控目的。「所以,這只是估計的數字,並可能受系統線程影響。你不應該依賴'activeCount',而應該使用'join'。 – binhgreat