生產者消費者問題

volidate使用方法 參考文檔html

描述: 聲明一個Plate對象爲plate,被線程A和線程B共享,A專門放雞蛋,B專門拿雞蛋。假設 開始,A調用plate.putEgg方法,此時eggs.size()爲0,所以順利將雞蛋放到盤子,還執行了notify()方法,喚醒鎖的阻塞隊列的線程,此時阻塞隊列尚未線程。java

又有一個A線程對象調用plate.putEgg方法,此時eggs.size()不爲0,調用wait()方法,本身進入了鎖對象的阻塞隊列。測試

此時,來了一個B線程對象,調用plate.getEgg方法,eggs.size()不爲0,順利的拿到了一個雞蛋,還執行了notify()方法,喚醒鎖的阻塞隊列的線程,此時阻塞隊列有一個A線程對象,喚醒後,它進入到就緒隊列,就緒隊列也就它一個,所以立刻獲得鎖,開始往盤子裏放雞蛋,此時盤子是空的,所以放雞蛋成功。線程

假設接着來了線程A,就重複2;假設來料線程B,就重複3。code

整個過程都保證了放雞蛋,拿雞蛋,放雞蛋,拿雞蛋。htm

package thread;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author sb
 *
 */
public class Plate{
	  List<Object> eggs=new ArrayList<Object>();  
	  public synchronized  Object getEgg(){
	     if(eggs.size()==0){  
	        try{  
	            wait();   //這裏放棄了同步鎖,好不容易獲得,又放棄了  
	        }catch(InterruptedException e){  
	        }  
	     }  
	  
	    Object egg=eggs.get(0); 
	    System.out.println("取雞蛋");
	    eggs.clear();//清空盤子  
	    notify();//喚醒阻塞隊列的某線程到就緒隊列  
	    return egg;  
	}  
	  
	 public synchronized  void putEgg(Object egg){
	   if(eggs.size()>0){  
	      try{  
	         wait();  //這裏放棄了同步鎖,好不容易獲得,又放棄了  
	      }catch(InterruptedException e){  
	      }  
	    }  
	    eggs.add(egg);//往盤子裏放雞蛋
	    System.out.println("放雞蛋");
	    notify();//喚醒阻塞隊列的某線程到就緒隊列  
	  }  
}

測試:對象

package thread;

public class PlateTest {
    public static void main(String[] args) {
		Plate  plate = new Plate();
		
		for(int i =0 ; i<100;i++){
			plate.putEgg("a");
			plate.getEgg();
		}
	}
}

測試輸出結果:blog

放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
放雞蛋
取雞蛋
相關文章
相關標籤/搜索