生产者消费者模式(synchronized实现)

试着写了下生产者消费者模式,大致意思是,N个生产者线程,M个消费者线程。生产者向容器加数据,消费者取数据。当容器size为0,或者满时。阻塞一类线程并交出锁的拥有权,或者激活所有线程。注意while判断容器当前容量,因为激活多个线程后操作还要继续判断。

public class MyConsumerProductor {
	ArrayList<String> list=new ArrayList<>();
	final private int Capacity = 10;
	//生产者
	class Consumer implements Runnable{
		@Override
		public void run() {
			while(true) {
				synchronized(MyConsumerProductor.class) {
					while(list.size()==Capacity) {//循环判断,因为激活多个线程
						try {
							System.out.println("容量满了,生产者进入等待");
							MyConsumerProductor.class.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}

					if(list.size()<10) {
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						list.add(Thread.currentThread().getName());
						System.out.println("product:"+Thread.currentThread().getName()+" size:"+list.size());
						if(list.size()==10) {
							MyConsumerProductor.class.notifyAll();
						}
					}
				}
			}
		}
	}

	//生产者
	class Productor implements Runnable{
		@Override
		public void run() {
			while(true) {
				synchronized(MyConsumerProductor.class) {
					while(list.size()==0) {
						try {
							System.out.println("容量没了,消费者进入等待");
							MyConsumerProductor.class.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}

					if(list.size()>0) {
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("consumer:"+list.remove(list.size()-1)+" size:"+list.size());
						if(list.size()==Capacity) {
							MyConsumerProductor.class.notifyAll();
						}
					}
				}
			}
		}
	}


	public static void main(String[] args) {
		MyConsumerProductor pc=new MyConsumerProductor();
		//生产者线程
		for(int i=0;i<5;i++) {
			new Thread(pc.new Consumer()).start();
		}
		//消费者线程
		for(int i=0;i<5;i++) {
			new Thread(pc.new Productor()).start();
		}
	}

}

猜你喜欢

转载自blog.csdn.net/yaoct/article/details/84264743