很長時間對join方法感到疑惑,不明白到底是誰要阻塞,誰要繼續執行(線程這部分亟需加強)。今天和一網友交流後疑惑得到解決,在此表示感謝Stephen_Liu。
假如在main方法中有個線程A,執行了A.join(),那麼線程A繼續執行,而main線程這阻塞在A.join()處,直到線程A執行完畢並正常退出,此時main方法中的A.join()才返回,然後繼續執行A.join()後面的代碼。
public class ThreadJoin extends Thread { public static int n = 0; static synchronized void inc() { n++; } public void run() { try { for (int i = 0; i < 10; i++) { inc(); sleep(3); } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { Thread thread[] = new Thread[100]; for (int i = 0; i < thread.length; i++) { thread[i] = new ThreadJoin(); } for (int i = 0; i < thread.length; i++) { thread[i].start(); } for (int i = 0; i < thread.length; i++) { thread[i].join(); //不使用這句話n是個隨機數,使用n=1000 } System.out.println("n=" + ThreadJoin.n); } }