1. 程式人生 > >join,wait執行緒理解

join,wait執行緒理解

參考書目《java核心技術卷1》

wait(),notify(),notifyAll()這三種方法屬於Object物件,且只能放在一個同步方法當中,而且對於當前執行緒不是物件鎖的持有者,這些方法會丟擲IllegalMonitorStateException異常,而且notify()隨機選擇一個在該物件上呼叫wait()方法的執行緒,解除其阻塞狀態,如果不滿足條件,則會繼續阻塞,所以容易產生死鎖現象。對於wait()方法是會釋放物件鎖的,所以在臨界域裡面可能會存在多個阻塞的執行緒,但是最終都喚醒之後,只會有一個進入臨界區域。而對於join()方法,只是等待對應執行緒結束後,但是不釋放物件鎖。

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.");
	}
}
測試結果:B0 B1 B2 B3 B4 A0 A1 A2 A3 A4 Main ended.可以看出在main執行緒當中執行緒A先執行,線上程B先執行,如果將Th1中的try塊註釋掉,則A和B執行緒會交替進行,但是對於主執行緒仍然在A,B執行緒之後。對於A和B執行緒,由於相互間的切換所以會丟擲中斷異常,這裡只考慮臨界區的同步問題,沒有原子性操作。