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

原创 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线程的wait方法和notify方法的运用(包含生产者消费者代码【已练习】)

source: http://blog.csdn.net/liranke/article/details/12222265 一. Java Thread类的几个函数的说明:  1.  ...

11.9-全栈Java笔记: 线程并发协作(生产者/消费者模式)

 多线程环境下,我们经常需要多个线程的并发和协作。这个时候,就需要了解一个重要的多线程并发协作模型“生产者消费者模式”。    什么是生产者? 生产者指的是负责生产数据的模块(这里模块可能...

消费者-生产者模式(线程的实现)

package dome3;/** * 模式:生产者 -- 消费者模式 * 引入模拟电影院情景(播放什么,观众看什么) * @author lzd * */public class movi...

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

一、S02E180_01线程_死锁二、S02E181_01线程_生产者消费者模式(信号灯法)三、S02E182_01线程_任务调度

java线程协作,经典生产者/消费者模式(二、Lock和Condition)

上一篇文章讲了使用synchronized关键字实现线程的生产者/消费者模式,今天将贴上另一种实现方式:Lock+Condition,这好像是JDK1.5以后的新特性,需要导入java.util.co...
  • ytTea
  • ytTea
  • 2016-06-21 22:28
  • 235

Java中的线程(七)- 生产者消费者模式

什么是生产者消费者模式 某个线程或进程负责产生数据,这些数据由另一个线程或进程来负责处理。产生数据的线程称为生产者;而处理数据的线程称为消费者。在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,...

java多线程(2):线程通信之生产者消费者模式及等待唤醒机制

前言前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作。大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变...

Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

想利用传统的线程通信wait(),notify(),notifyAll()方法,必须依赖于同步监听器的存在,也就是说,对于synchronized修饰的同步方法,因为该类的默认实例(this)就是同步...

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

多线程系列教程: java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(二) 本篇我...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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