join,wait執行緒理解
阿新 • • 發佈:2019-01-27
參考書目《java核心技術卷1》
wait(),notify(),notifyAll()這三種方法屬於Object物件,且只能放在一個同步方法當中,而且對於當前執行緒不是物件鎖的持有者,這些方法會丟擲IllegalMonitorStateException異常,而且notify()隨機選擇一個在該物件上呼叫wait()方法的執行緒,解除其阻塞狀態,如果不滿足條件,則會繼續阻塞,所以容易產生死鎖現象。對於wait()方法是會釋放物件鎖的,所以在臨界域裡面可能會存在多個阻塞的執行緒,但是最終都喚醒之後,只會有一個進入臨界區域。而對於join()方法,只是等待對應執行緒結束後,但是不釋放物件鎖。
測試結果:B0 B1 B2 B3 B4 A0 A1 A2 A3 A4 Main ended.可以看出在main執行緒當中執行緒A先執行,線上程B先執行,如果將Th1中的try塊註釋掉,則A和B執行緒會交替進行,但是對於主執行緒仍然在A,B執行緒之後。對於A和B執行緒,由於相互間的切換所以會丟擲中斷異常,這裡只考慮臨界區的同步問題,沒有原子性操作。class Th1 implements Runnable{ public void run() { Thread b=new Thread(new Th2()); b.start(); try { b.join(); } catch (InterruptedException e) { e.printStackTrace(); } for(int i=0;i<5;i++) System.out.println("A"+i); } } class Th2 implements Runnable{ public void run() { for(int i=0;i<5;i++) System.out.println("B"+i); } } public class Rewrite { public static void main(String[] args) throws InterruptedException{ Thread a=new Thread(new Th1()); a.start(); a.join(); System.out.println("Main ended."); } }