简单的多生产多消费模式代码

原创 2018年04月16日 16:25:25

资源描述类:

/**
 * 资源描述类
 * @author gaojh
 *
 */
public class Product {
	
	List<String> product = null;

	public Product() {
		super();
		this.product = new ArrayList<>();
	} 

	/**
	 * 生产方法
	 * @author: gaojh
	 * @throws InterruptedException 
	 * @date: 2018年4月16日 下午3:53:29
	 */
	public synchronized void produce() throws InterruptedException{
		if(product != null && product.size() < 1000){ //仅在产品List不为null且长度小于10时进行生产
			String singleProduct =  Thread.currentThread().getName() + "的产品";
			product.add(singleProduct);
			System.out.println(Thread.currentThread().getName()+"生产了"+singleProduct);
		}else{
			System.out.println(Thread.currentThread().getName()+"开始唤醒了");
			this.notifyAll();
			System.out.println(Thread.currentThread().getName()+"进入wait了");
			this.wait();
		}
	}
	
	
	/**
	 * 消费方法
	 * @author: gaojh
	 * @throws InterruptedException 
	 * @date: 2018年4月16日 下午3:53:29
	 */
	public synchronized void consume() throws InterruptedException{
		
		if(product != null && product.size() > 0){ //仅在产品List不为null且长度大于0时进行消费
			String singleProduct =  product.remove(0); //消费第一个
			System.out.println(Thread.currentThread().getName()+"消费了"+singleProduct);
		}else{
			System.out.println(Thread.currentThread().getName()+"开始唤醒了");
			this.notifyAll();
			System.out.println(Thread.currentThread().getName()+"进入wait了");
			this.wait();
		}
		
	}
	
}

生产者:

/**
 * 生产者类
 * @author gaojh
 *
 */
public class Producer implements Runnable{
	
	Product product = null;
	
	public Producer(Product product) {
		super();
		this.product = product;
	}
	
	@Override
	public void run() {
		//生产逻辑
		try {
			while(true){
				product.produce();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

消费者:

/**
 * 消费者类
 * @author gaojh
 *
 */
public class Consumer implements Runnable{
	
	Product product = null;
	
	public Consumer(Product product) {
		super();
		this.product = product;
	}

	@Override
	public void run() {
		//消费逻辑
		try {
			while(true){
				product.consume();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

Main方法类:

/**
 * 测试多生产多消费
 * @author gaojh
 *
 */
public class TestThread {
	
	public static void main(String[] args) {
		Product product = new Product(); //创建唯一资源
		
		//生产者
		Producer producer = new Producer(product);
		
		Thread producer1 = new Thread(producer); //生产者1
		producer1.setName("生产者1");
		Thread producer2 = new Thread(producer); //生产者2
		producer2.setName("生产者2");
		Thread producer3 = new Thread(producer); //生产者3
		producer3.setName("生产者3");
		
		producer1.start();
		producer2.start();
		producer3.start();
		
		//消费者
		Consumer consumer = new Consumer(product);
		
		Thread consumer1 = new Thread(consumer); //消费者1
		consumer1.setName("消费者1");
		Thread consumer2 = new Thread(consumer); //消费者2
		consumer2.setName("消费者2");
		Thread consumer3 = new Thread(consumer); //消费者3
		consumer3.setName("消费者3");
		consumer1.start();
		consumer2.start();
		consumer3.start();
		
	}
}


问:为什么在notifyAll之后让当前线程wait?

答:当前线程既然已经执行到notifyAll了,说明当前线程该做的及该类型线程该做的都已经完成了,如果下次竞争syn的锁,当前线程再次竞争持有(很有可能),只是进来唤醒了其他线程而已,没有必要,wait至少可以让当前线程释放锁,等待被唤醒。这样竞争线程从6个变为5个,无论是生产者还是消费者进入等待,对方线程只有syn锁的数字几率都会变大。


PS:现在在产品满了/空了后,无法指定唤醒消费者/生产者,只能全部唤起然后一个一个判断。效率上不行,要想办法修改。

java多线程之生产消费模式

/*@author shijin  * 生产者与消费者模型中,要保证以下几点:  * 1 同一时间内只能有一个生产者生产     生产方法加锁sychronized  * 2 同一时间内只能有一...
  • BloodyDmusic
  • BloodyDmusic
  • 2016-07-22 13:01:19
  • 955

ActiveMQ 由浅入深之二(生产消费模式)

今天的主题了,怎样在Java中使用ActiveMQ提供的API实现消息的订阅和发布 1、首先需要导入apache-activemq-5.5.1\lib目录下需要用到的jar文件,项目结构如下图所示 ...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2015-06-09 22:58:45
  • 565

JAVA多线程-线程间通信(二)-生产者/消费者模式实现

二、生产者/消费者模式实现     生产者/消费者模式是等待/唤醒机制的经典案例 1、一生产与一消费:操作值 package org.jksoft.thread.product; import...
  • qq_26504875
  • qq_26504875
  • 2016-02-20 15:53:28
  • 344

高性能并发框架 Disruptor 介绍 实现生产者消费者模型

51CTO 译文框架介绍: http://developer.51cto.com/art/201306/399370.htm #Disruptor Disruptor 的源码非常精...
  • u011278496
  • u011278496
  • 2014-08-22 22:30:02
  • 3602

多线程中多生产多消费问题

一、多生产多消费实例 多线程中多生产多消费问题的解决有助于更好的理解多线程的使用。现在通过实例来说明多线程中需要注意的地方。 /** * @author zqx 描述资源 */ public ...
  • biedazhangshu
  • biedazhangshu
  • 2015-10-06 17:35:32
  • 1492

深入生产者与消费者模式

前提 本示例是生产者向堆栈中 List 对象中放入数据,使消费者从 List 堆栈中取出数据。List 最大容量是 1一生产一消费——操作栈MyStack代码import java.util.Arr...
  • github_34889651
  • github_34889651
  • 2016-09-20 08:32:10
  • 468

简单生产消费模式的代码流程(Java代码)

简单生产消费模式的代码流程(Java代码)
  • starjuly
  • starjuly
  • 2016-12-11 16:00:15
  • 985

关于java多线程浅析一:简单实现生产消费模式

关于什么是线程,这里就不过多介绍了。但为什么要用多线程呢?原因无他,就是希望更好的利用CPU资源。当然,多线程在模拟很多实际场景下,也是一把利器,就比如生产-消费模式,使用不同的线程来充当生产者和消费...
  • zhangjunfei12103323
  • zhangjunfei12103323
  • 2017-05-11 15:01:05
  • 1394

Java中多线程的多生产多消费问题的解决方案

/*创建线程的第二种方式1、实现Runnable接口2、覆盖run方法3、通过Thread类创建线程对象4、将Runnable接口的子类对象作为实参传递给Thread类中的构造函数5、调用start方...
  • wangchunlei123
  • wangchunlei123
  • 2014-04-16 14:31:31
  • 1203

生产消费模式之数据结构策略

代写
  • aazhoukeaa
  • aazhoukeaa
  • 2016-10-31 10:43:09
  • 195
收藏助手
不良信息举报
您举报文章:简单的多生产多消费模式代码
举报原因:
原因补充:

(最多只允许输入30个字)