今天在学习线程的时候接触到消费者和生产者模式,写了简单的代码

原创 2016年08月28日 22:26:07
package javaluange2;

import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConsumerProducer {

	private static Buffer buffer = new Buffer();

	public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(2);
		executor.execute(new ProducerTask());
		executor.execute(new ConsumerTask());
		executor.shutdown();
	}

	/**
	 * 生产者
	 * 
	 * @author baqy
	 *
	 */
	private static class ProducerTask implements Runnable {

		@Override
		public void run() {
			try {
				int i = 1;
				while (true) {
					System.out.println("\t\tProducer writes " + i);
					buffer.write(i++);
					Thread.sleep((int) (Math.random() * 10000) );
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

	/**
	 * 消费者
	 * 
	 * @author baqy
	 *
	 */
	private static class ConsumerTask implements Runnable {

		@Override
		public void run() {
			try {
				while (true) {
					System.out.println("\t\tConsumer reads " + buffer.read());
					Thread.sleep((int) (Math.random() * 10) + 1);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

	private static class Buffer {
		private static final int CAPACITY = 1;
		private LinkedList<Integer> queue = new LinkedList<Integer>();
		private static Lock lock = new ReentrantLock();// create a lock
		// create two conditions
		private static Condition NotEmpty = lock.newCondition();
		private static Condition NotFull = lock.newCondition();

		public int read() {
			int value=0;
			lock.lock();
			try {
				//当队列中为空时等待
				while (queue.isEmpty()) {
						System.out.print("wait for notEmpty condition");
						NotEmpty.await();
				}
				//不为空的时候读取对首元素
				value= queue.remove();
				NotFull.signal();//唤醒notFull 条件
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally {
				lock.unlock();
				return value;
			}
			
		}

		public void write(int value) {
			lock.lock();
			try {
				while (queue.size() == CAPACITY) {// 容量已满
					System.out.print("\t\twait for not full condition");
					NotFull.await();
				}
				//容量不满时在队列中添加到队尾
				queue.offer(value);
				//唤醒notEmpty 条件
				NotEmpty.signal();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally {
				lock.unlock();
			}
		}

	}
}

这个例子假设缓冲区存储整数,大小也是受限的,缓冲区提供了write(),read(),在写入缓冲区的时候判断大小是否已经满了,就让线程处于等待,消费也是判断缓冲区是否为空,空就等待。这就是两个条件,通过Lock创建出来的,队列是用链表生成的,在队尾生产,队首消费,在满足添加之后唤醒消费者,消费者也是一样,消费完了唤醒生产者。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Java多线程之简单生产者和消费者例子

一,在本例子中,有三个类,dataStore(存放数据类),consumer(消费者),producer(生产者)。 二,看源码例子: 类dataStore: import java.lang....
  • ganpengjin1
  • ganpengjin1
  • 2015年04月18日 15:13
  • 1829

Java多线程编程中生产者-消费者模式的详解

生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程...
  • ghuiL
  • ghuiL
  • 2014年11月12日 15:24
  • 6885

Java Executor并发框架(十四)Executor框架线程池使用原始方式实现生产者消费者模式

一、介绍        在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以...
  • pfnie
  • pfnie
  • 2016年10月18日 22:20
  • 1304

线程_死锁_生产者消费者模式(信号灯法)_任务调度JAVA180-182

一、S02E180_01线程_死锁二、S02E181_01线程_生产者消费者模式(信号灯法)三、S02E182_01线程_任务调度...
  • u013292493
  • u013292493
  • 2016年01月24日 22:47
  • 383

java 多线程并发系列之 生产者消费者模式的两种实现

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。 真实世界中的生产者消费者模式...
  • yujin753
  • yujin753
  • 2015年05月14日 16:59
  • 11601

Java中简单的生产者和消费者问题

生产者和消费者问题描述:   仓库初始值为0, 生产者首先生产产品,生产产品后将产品放入仓库,仓库中产品数量变为1, 此时生产者不在生产产品,直到消费者进入仓库消费掉产品后,将仓库产品数量变为0,生...
  • To_be_Designer
  • To_be_Designer
  • 2015年08月05日 20:37
  • 1286

如何实现生产者消费者模式

生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”、“消费者”、“仓库”和“产品”。他们之间的关系如下: ① 生产者仅仅在仓储未满时候生产,仓满则停止生产。 ② 消费者仅仅在仓储...
  • u010339647
  • u010339647
  • 2016年07月24日 11:33
  • 3985

线程间通信,生产者消费者问题!

线程之间的通信简介: 一般而言,在一个应用程序中(即进程),一个线程往往不是孤立存在的,常常需要和其它线程通信,以执行特定的任务。如主线程和次线程,次线程与次线程,工作线程和用户界面线程等。这样...
  • fangleijiang
  • fangleijiang
  • 2014年06月03日 19:41
  • 1129

JAVA多线程(三)生产者消费者模式及实现方法

介绍了生产者消费者模式以及实现方法(wait¬ify,阻塞队列
  • antony9118
  • antony9118
  • 2016年05月23日 15:15
  • 2133

简单生产者消费者模型(java实现)

/** * Created by butter on 16-11-16. */ /** * * 生产者与消费者模型中,要保证以下几点: * 1 同一时间内只能有一个生产者生产 ...
  • Dextrad_ihacker
  • Dextrad_ihacker
  • 2016年11月16日 21:24
  • 271
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:今天在学习线程的时候接触到消费者和生产者模式,写了简单的代码
举报原因:
原因补充:

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