多執行緒,Join()
阿新 • • 發佈:2021-12-05
一、定義:就是該執行緒是指的主執行緒等待子執行緒的終止。也就是在子執行緒呼叫了join()方法,後面的程式碼,只有等到子執行緒結束了才能執行
二、不加join:
class Thread1 extends Thread{ private String name; public Thread1(String name) { super(name); this.name=name; } public void run() { System.out.println(Thread.currentThread().getName() + " 執行緒執行開始!"); for (int i = 0; i < 5; i++) { System.out.println("子執行緒"+name + "執行 : " + i); try { sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " 執行緒執行結束!"); } } public class Main { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()+"主執行緒執行開始!"); Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); System.out.println(Thread.currentThread().getName()+ "主執行緒執行結束!"); } 輸出結果: main主執行緒執行開始! main主執行緒執行結束! B 執行緒執行開始! 子執行緒B執行 : 0 A 執行緒執行開始! 子執行緒A執行 : 0 子執行緒B執行 : 1 子執行緒A執行 : 1 子執行緒A執行 : 2 子執行緒A執行 : 3 子執行緒A執行 : 4 A 執行緒執行結束! 子執行緒B執行 : 2 子執行緒B執行 : 3 子執行緒B執行 : 4 B 執行緒執行結束! 發現主執行緒比子執行緒早結束
三、加join:
public class Main { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()+"主執行緒執行開始!"); Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); try { mTh1.join(); } catch (InterruptedException e) { e.printStackTrace(); } try { mTh2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ "主執行緒執行結束!"); } } 輸出結果: main主執行緒執行開始! A 執行緒執行開始! 子執行緒A執行 : 0 B 執行緒執行開始! 子執行緒B執行 : 0 子執行緒A執行 : 1 子執行緒B執行 : 1 子執行緒A執行 : 2 子執行緒B執行 : 2 子執行緒A執行 : 3 子執行緒B執行 : 3 子執行緒A執行 : 4 子執行緒B執行 : 4 A 執行緒執行結束! 主執行緒一定會等子執行緒都結束了才結束