多生产者多消费者问题

Posted Sprint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多生产者多消费者问题相关的知识,希望对你有一定的参考价值。

package test;

/**
 * 多生产者 多消费者问题
 * 
 * 该代码存在死锁问题
 * 因为有可能唤醒本方 
 * @author 黄二狗
 *
 */

public class Test {
     public static void main(String[] args) {
		Resource r = new Resource();
		Producer producer = new Producer(r);
		Consumer consumer = new Consumer(r);
		Thread t0 = new Thread(producer);
		Thread t1 = new Thread(producer);
		Thread t2 = new Thread(consumer);
		Thread t3 = new Thread(consumer);
		t0.start();
		t1.start();
		t2.start();
		t3.start();
	}
}

class Resource {
	private String name;
	private int count;
	private boolean flag;
	
	public synchronized void set(String name) throws InterruptedException {
		while(flag) 
			this.wait();  // t0 t1 
		this.name = name + count;
		count++;     
		System.out.println(Thread.currentThread().getName() + "....生产者..." + this.name);
		flag = true;
		this.notify();
	}
	
	public synchronized void out() throws InterruptedException {
		while(!flag)    //t2 t3
			this.wait();  
		System.out.println(Thread.currentThread().getName() + "....消费者..." + this.name);
		flag = false;
		this.notify();
	}
}

class Producer implements Runnable {
	 private Resource r;
	 public Producer(Resource r) {
		 this.r = r;
	 }
	@Override
	public void run() {
	   while(true) {
		   try {
			r.set("烤鸭");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	   }	
	}
}

class Consumer implements Runnable {
	 private Resource r;
	 public Consumer(Resource r) {
		 this.r = r;
	 }
	@Override
	public void run() {
		try {
			while(true) {
			  r.out();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  改进方法:将notify()换成notifyAll(),这样的话就不会产生死锁了.

 

package test;

/**
 * 多生产者 多消费者问题
 * 
 * 该代码存在死锁问题
 * 因为有可能唤醒本方 
 * @author 黄二狗
 *
 */

public class Test {
     public static void main(String[] args) {
		Resource r = new Resource();
		Producer producer = new Producer(r);
		Consumer consumer = new Consumer(r);
		Thread t0 = new Thread(producer);
		Thread t1 = new Thread(producer);
		Thread t2 = new Thread(consumer);
		Thread t3 = new Thread(consumer);
		t0.start();
		t1.start();
		t2.start();
		t3.start();
	}
}

class Resource {
	private String name;
	private int count;
	private boolean flag;
	
	public synchronized void set(String name) throws InterruptedException {
		while(flag) 
			this.wait();  // t0 t1 
		this.name = name + count;
		count++;     
		System.out.println(Thread.currentThread().getName() + "....生产者..." + this.name);
		flag = true;
		this.notifyAll();
	}
	
	public synchronized void out() throws InterruptedException {
		while(!flag)    //t2 t3
			this.wait();  
		System.out.println(Thread.currentThread().getName() + "....消费者..." + this.name);
		flag = false;
		this.notifyAll();
	}
}

class Producer implements Runnable {
	 private Resource r;
	 public Producer(Resource r) {
		 this.r = r;
	 }
	@Override
	public void run() {
	   while(true) {
		   try {
			r.set("烤鸭");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	   }	
	}
}

class Consumer implements Runnable {
	 private Resource r;
	 public Consumer(Resource r) {
		 this.r = r;
	 }
	@Override
	public void run() {
		try {
			while(true) {
			  r.out();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  

 

以上是关于多生产者多消费者问题的主要内容,如果未能解决你的问题,请参考以下文章

多线程_多生产者多消费者的实现问题

多生产者多消费者问题

多线程-线程间通信-多生产者多消费者示例

具有单队列的 Rabbit MQ 中的多生产者、多消费者

Disrunptor多生产者多消费者模型讲解

Linux多进程通信多生产者一消费者