天天看点

生产者消费者例子-采用wait()和notify()

package com.ProductAndConsume;

public class Storage {
	private int maxnum;
	private int left;
	public Storage(int max){
		this.maxnum = max;
	}
		public synchronized void product(int expect){
		while(true){
			System.out.println("start to product");
			if(expect>this.maxnum){
				System.out.println("The storage max is:"+this.maxnum+",you can only product that");
				expect = this.maxnum;
			}
			System.out.println("thread:"+Thread.currentThread().getName()+",expect product:"+expect);
			if(left>=maxnum){
				try {
					System.out.println("product wait left:"+left+",expect:"+expect);
					wait();
				} catch (InterruptedException e) {
					
				}
			}
			left += (maxnum-left)>expect?expect:maxnum-left;
			System.out.println("thread:"+Thread.currentThread().getName()+",product over,left:"+left+",expect:"+expect);
			notifyAll();
		}
	}
	public synchronized void consume(int expect){
		while(true){
			System.out.println("start to consume");
			if(expect>this.maxnum){
				System.out.println("The storage max is:"+this.maxnum+",you can only product that");
				expect = this.maxnum;
			}
			System.out.println("thread:"+Thread.currentThread().getName()+",expect consume:"+expect);
			if(left<expect try="" system="" out="" println="" consume="" wait="" left:="" left="" expect:="" expect="" catch="" interruptedexception="" e="" todo="" auto-generated="" block="" printstacktrace="" -="(left-expect)">0?expect:left;
			System.out.println("thread:"+Thread.currentThread().getName()+",consume over,left:"+left+",expect:"+expect);
			notifyAll();
		}
	}
	public static void main(String[] args){
		Storage storage = new Storage(200);
		Producer producer1 = new Producer(storage, 10);
		Consumer consumer2 = new Consumer(storage, 30);
		Thread thread1 = new Thread(producer1);
		thread1.start();
		Thread thread2 = new Thread(consumer2);
		thread2.start();
	}
}

</expect>
           
package com.ProductAndConsume;

public class Producer implements Runnable {
	private int expect;
	private Storage storage;
    public Producer(Storage storage,int expect){
    	this.storage = storage;
    	this.expect = expect;
    }
	@Override
	public void run() {
		storage.product(expect);
	}

}

           
package com.ProductAndConsume;

public class Consumer implements Runnable {
	private int expect;
	private Storage storage;
    public Consumer(Storage storage,int expect){
    	this.storage = storage;
    	this.expect = expect;
    }
	@Override
	public void run() {
		storage.consume(expect);

	}

}