天天看點

使用wait()和notifyAll()實作生産者消費者模型使用wait()和notifyAll()實作生産者消費者模型

使用wait()和notifyAll()實作生産者消費者模型

下面将實作三個類,Generater為生産者,Consumer為消費者,Taobao為中間平台。給出代碼。

生産者Generater:

package generater_and_consumer;

public class Generater implements Runnable{
    private Taobao taobao;
    public Generater(Taobao taobao) {
          this.taobao=taobao;
	}
	@Override
	public void run() {
		while(true){
			taobao.push();
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
           

消費者Consumer:

package generater_and_consumer;

public class Consumer implements Runnable{
     private Taobao taobao;
     public Consumer(Taobao taobao) {
		this.taobao=taobao;
	}
	@Override
	public void run() {
		while(true){
			taobao.take();
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
     
}
           

中間平台Taobao:

package generater_and_consumer;

public class Taobao {
       private int count;
       public final int MAX_COUNT=10;
       public synchronized void push(){
    	   while(count>=MAX_COUNT){
    		   try {
    			   System.out.println(Thread.currentThread().getName()+"數量達到上限,生産者暫停生産");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    	   }
    	   count++;
    	   System.out.println(Thread.currentThread().getName()+"生産者生産,目前庫存為:"+count);
    	   notifyAll();
       }       
       public synchronized void take(){
    	   while(count<=0){
    		   try {
    			   System.out.println(Thread.currentThread().getName()+"目前庫存為零,消費者等待中");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    	   }
    	   count--;
    	   System.out.println(Thread.currentThread().getName()+"消費者消費了,目前庫存為"+count);
    	   notifyAll();
       }
       
}
           

最後編寫測試類進行測試:

package generater_and_consumer;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {
       public static void main(String[] args) {
		Taobao taobao=new Taobao();
		Generater g=new Generater(taobao);
		Consumer c=new Consumer(taobao);
		
	    new Thread(g).start();
	    new Thread(g).start();
	    new Thread(g).start();
	    
	    new Thread(c).start();

	}
}
           

貼出部分實驗結果:

Thread-0生産者生産,目前庫存為:1
Thread-1生産者生産,目前庫存為:2
Thread-3消費者消費了,目前庫存為1
Thread-2生産者生産,目前庫存為:2
Thread-1生産者生産,目前庫存為:3
Thread-0生産者生産,目前庫存為:4
Thread-2生産者生産,目前庫存為:5
Thread-3消費者消費了,目前庫存為4
Thread-1生産者生産,目前庫存為:5
Thread-3消費者消費了,目前庫存為4
Thread-2生産者生産,目前庫存為:5
Thread-0生産者生産,目前庫存為:6
Thread-1生産者生産,目前庫存為:7
Thread-3消費者消費了,目前庫存為6
Thread-2生産者生産,目前庫存為:7
Thread-0生産者生産,目前庫存為:8
Thread-1生産者生産,目前庫存為:9
Thread-2生産者生産,目前庫存為:10
Thread-3消費者消費了,目前庫存為9
Thread-0生産者生産,目前庫存為:10
Thread-1數量達到上限,生産者暫停生産
Thread-3消費者消費了,目前庫存為9
Thread-2生産者生産,目前庫存為:10
Thread-1數量達到上限,生産者暫停生産
Thread-0數量達到上限,生産者暫停生産
Thread-2數量達到上限,生産者暫停生産
Thread-3消費者消費了,目前庫存為9
Thread-2生産者生産,目前庫存為:10
Thread-0數量達到上限,生産者暫停生産
Thread-1數量達到上限,生産者暫停生産
Thread-3消費者消費了,目前庫存為9
Thread-1生産者生産,目前庫存為:10
Thread-0數量達到上限,生産者暫停生産
Thread-2數量達到上限,生産者暫停生産