java并发控制经典场景-生产者/消费者

阅读更多

java并发控制四种方法:

1.wait()/notify();

2. await() / signal() ;

3.BlockingQueue 阻塞队列方法;

4.PipedInputStream / PipedOutputStream


最常用的是wait()/notify(),简单demo见代码:

 

 

仓库类:

import java.util.LinkedList;

public class Storage {

	public static final int MAX_SIZE = 100;

	private LinkedList list = new LinkedList();

	public void produce(int num) {
		synchronized (list) {
			while (num + list.size() > Storage.MAX_SIZE) {
				System.out.println("要生产的产品数量:" + num + "库存量"
						+ list.size() + "暂不能执行生产任务");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			for (int i = 0; i < num; i++) {
				list.add(new Object());
			}
			System.out.println("已经生产产品数:" + num + "现库存量为:" + list.size());
			list.notifyAll();
		}
	}

	public void consume(int num) {
		synchronized (list) {
			while (num > list.size()) {
				System.out.println("要消费的产品数量:" + num + "库存量:"
						+ list.size() + "暂时不能执行消费任务!");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			for (int i = 1; i <= num; ++i) {
				list.remove();
			}

			System.out.println("已经消费产品数:" + num + "现库存量为:" + list.size());

			list.notifyAll();
		}
	}

	public LinkedList getList() {
		return list;
	}

	public void setList(LinkedList list) {
		this.list = list;
	}
	
} 
 

 生产者类:

public class Producer implements Runnable {
	private int num;
	
	private Storage storage;
	
	public Producer(Storage storage){
		this.storage = storage;
	}

	@Override
	public void run() {
		this.produce();
	}
	
	public void produce(){
		this.storage.produce(this.num);
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Storage getStorage() {
		return storage;
	}

	public void setStorage(Storage storage) {
		this.storage = storage;
	}

}

 消费者类:

public class Consumer implements Runnable {
	
	private int num;
	
	private Storage storage;
	
	public Consumer(Storage storage){
		this.storage = storage;
	}

	@Override
	public void run() {
		this.consume();
	}
	
	private void consume(){
		this.storage.consume(this.num);
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Storage getStorage() {
		return storage;
	}

	public void setStorage(Storage storage) {
		this.storage = storage;
	}
	
	
	
}

 测试方法类:

public class SysTest {
	public static void main(String[] args) {
		Storage storage = new Storage();
		Producer pt1 = new Producer(storage);
		pt1.setNum(10);
		Producer pt2 = new Producer(storage);
		pt2.setNum(10);
		Producer pt3 = new Producer(storage);
		pt3.setNum(10);
		Producer pt4 = new Producer(storage);
		pt4.setNum(10);
		Producer pt5 = new Producer(storage);
		pt5.setNum(10);
		Producer pt6 = new Producer(storage);
		pt6.setNum(10);
		Producer pt7 = new Producer(storage);
		pt7.setNum(80);
		
		
		Thread p1 = new Thread(pt1);
		Thread p2 = new Thread(pt2);
		Thread p3 = new Thread(pt3);
		Thread p4 = new Thread(pt4);
		Thread p5 = new Thread(pt5);
		Thread p6 = new Thread(pt6);
		Thread p7 = new Thread(pt7);
		
		
		Consumer ct1 = new Consumer(storage);
		ct1.setNum(50);
		Consumer ct2 = new Consumer(storage);
		ct2.setNum(20);
		Consumer ct3 = new Consumer(storage);
		ct3.setNum(30);
		
		Thread c1 = new Thread(ct1);
		Thread c2 = new Thread(ct2);
		Thread c3 = new Thread(ct3);
		
		
		c1.start();
		c2.start();
		c3.start();
		
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
		
	}
}

 结果:

要消费的产品数量:50库存量:0暂时不能执行消费任务!
要消费的产品数量:30库存量:0暂时不能执行消费任务!
已经生产产品数:10现库存量为:10
要消费的产品数量:30库存量:10暂时不能执行消费任务!
要消费的产品数量:20库存量:10暂时不能执行消费任务!
要消费的产品数量:50库存量:10暂时不能执行消费任务!
已经生产产品数:10现库存量为:20
已经生产产品数:10现库存量为:30
已经生产产品数:10现库存量为:40
要消费的产品数量:50库存量:40暂时不能执行消费任务!
已经消费产品数:20现库存量为:20
要消费的产品数量:30库存量:20暂时不能执行消费任务!
已经生产产品数:10现库存量为:30
要消费的产品数量:50库存量:30暂时不能执行消费任务!
要生产的产品数量:80库存量30暂不能执行生产任务
已经消费产品数:30现库存量为:0
已经生产产品数:10现库存量为:10
已经生产产品数:80现库存量为:90
已经消费产品数:50现库存量为:40

你可能感兴趣的:(java,生产者,消费者,并发控制)