Java之執行緒通訊

鄭清發表於2018-08-29

執行緒通訊:一個執行緒與其他執行緒可以傳送資料

ex:

/**
 * 執行緒通訊
 * 業務邏輯:
 * 	兩個執行緒:
 * 		執行緒一:模擬養雞場的工人      ==>工作:檢查雞有沒有下蛋,所過下了,收蛋
 *      執行緒二:模擬養雞場的雞          ==>工作:下蛋
 *        
 *  wait() : 使當前執行緒暫停。                         可以由任何物件呼叫
 *  notify() : 使wait狀態的執行緒繼續執行      注意 :呼叫wait方法的物件 與 呼叫notify方法的物件是同一個
 *  
 *  注意事項:呼叫wait方法與 notify方法的程式碼必須在同步程式碼塊中,並且這兩個同步程式碼塊加鎖的物件必須一致
 *  @author 鄭清		
 */
public class Demo {
	static boolean hasEggs = false;//值為false表示沒有蛋   值為true表示有蛋
	
	public static void main(String[] args) {
		Object obj = new Object();
		Object obj2 = new Object();
		
		Thread chicken = new Thread(){
			public void run() {
				while(true){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("雞下蛋了 ...");
					hasEggs = true;
					//讓worker執行緒繼續執行
					synchronized (obj) {
						obj.notify();
					}
				}
			}
		};
		
		Thread worker = new Thread(){
			@Override
			public void run() {
				while(true){
					if(!hasEggs){
						System.out.println("檢查雞下蛋了沒有 ...");
						//當前執行緒暫停。  chicken執行緒下蛋之後繼續執行,通知當前執行緒繼續執行
						try {
							synchronized (obj) {
								obj.wait();
							}
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}else{
						System.out.println("收雞蛋 ...");
						hasEggs = false;
					}
				}
			}
		};
		
		chicken.start();
		worker.start();
	}
}

執行結果圖:

相關文章