Java多執行緒join()
阿新 • • 發佈:2018-11-13
原文出處http://www.cnblogs.com/skywang12345/p/3479275.html
join( )的作用:讓“主執行緒”等待“子執行緒”結束之後才能繼續執行。這句話可能有點晦澀,我們還是通過例子去理解
說明:// 主執行緒 public class Father extends Thread { public void run() { Son s = new Son(); s.start(); s.join(); ... } } // 子執行緒 public class Son extends Thread { public void run() { ... } }
上面有兩個類Father(主執行緒類)和Son(子執行緒類)。因為Son是在Father中建立並啟動的,所以,Father是主執行緒類,Son是子執行緒類。
在Father主執行緒中,通過new Son()新建“子執行緒s”,接著通過s.start()啟動“子執行緒s”,並且呼叫s.join().在呼叫s.join()之後,Father主執行緒會一直等待,知道“子執行緒s”執行完畢;在“子執行緒s”執行完畢之後,Father主執行緒才能接著執行。這也就是我們所說的“join()”的作用,是讓主執行緒等待子執行緒結束之後才能繼續執行!
join()示例
執行結果: t1 start t1 finish main finish// JoinTest.java的原始碼 public class JoinTest{ public static void main(String[] args){ try { ThreadA t1 = new ThreadA("t1"); // 新建“執行緒t1” t1.start(); // 啟動“執行緒t1” t1.join(); // 將“執行緒t1”加入到“主執行緒main”中,並且“主執行緒main()會等待它的完成” System.out.printf("%s finish\n", Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } static class ThreadA extends Thread{ public ThreadA(String name){ super(name); } public void run(){ System.out.printf("%s start\n", this.getName()); // 延時操作 for(int i=0; i <1000000; i++) ; System.out.printf("%s finish\n", this.getName()); } } }
結果說明: (1)在“主執行緒main”中通過 new ThreadA(“t1”)新建“執行緒t1”。接著通過t1.start()啟動大概“執行緒t1”,並執行t1.join(). (2)執行t1.join()之後,“主執行緒main”會進入“阻塞狀態”等待t1執行結束。“子執行緒t1”結束之後,會喚醒“主執行緒main”,“主執行緒”重新獲取cpu執行權,繼續執行。