java实现生产者消费者问题(转)
引言
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
生产者消费者图
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
JAVA解决线程模型的三种方式
1、wait()和notify()
import java.util.LinkedList;public class ProducerConsumer {private LinkedList<Object> storeHouse = new LinkedList<Object>();private int MAX = 10;public ProducerConsumer() {}public void start() {new Producer().start();new Comsumer().start();}class Producer extends Thread {public void run() {while (true) {synchronized (storeHouse) {try {while (storeHouse.size() == MAX) {System.out.println("storeHouse is full , please wait");storeHouse.wait();}Object newOb = new Object();if (storeHouse.add(newOb)) {System.out.println("Producer put a Object to storeHouse");Thread.sleep((long) (Math.random() * 3000));storeHouse.notify();}} catch (InterruptedException ie) {System.out.println("producer is interrupted!");}}}}}class Comsumer extends Thread {public void run() {while (true) {synchronized (storeHouse) {try {while (storeHouse.size() == 0) {System.out.println("storeHouse is empty , please wait");storeHouse.wait();}storeHouse.removeLast();System.out.println("Comsumer get a Object from storeHouse");Thread.sleep((long) (Math.random() * 3000));storeHouse.notify();} catch (InterruptedException ie) {System.out.println("Consumer is interrupted");}}}}}public static void main(String[] args) throws Exception {ProducerConsumer pc = new ProducerConsumer();pc.start();} }
2、await()和signal(),即线程锁的方式
package sort;import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumer {private LinkedList<Object> myList = new LinkedList<Object>();private int MAX = 10;private final Lock lock = new ReentrantLock();private final Condition full = lock.newCondition();private final Condition empty = lock.newCondition();public ProducerConsumer() {}public void start() {new Producer().start();new Consumer().start();}public static void main(String[] args) throws Exception {ProducerConsumer s2 = new ProducerConsumer();s2.start();}class Producer extends Thread {public void run() {while (true) {lock.lock();try {while (myList.size() == MAX) {System.out.println("warning: it's full!");full.await();}Object o = new Object();if (myList.add(o)) {System.out.println("Producer: " + o);empty.signal();}} catch (InterruptedException ie) {System.out.println("producer is interrupted!");} finally {lock.unlock();}}}}class Consumer extends Thread {public void run() {while (true) {lock.lock();try {while (myList.size() == 0) {System.out.println("warning: it's empty!");empty.await();}Object o = myList.removeLast();System.out.println("Consumer: " + o);full.signal();} catch (InterruptedException ie) {System.out.println("consumer is interrupted!");} finally {lock.unlock();}}}}}
3、阻塞队列的方式
import java.util.concurrent.*;public class ProducerConsumer {// 建立一个阻塞队列private LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10);public ProducerConsumer() {}public void start() {new Producer().start();new Consumer().start();}public static void main(String[] args) throws Exception {ProducerConsumer s3 = new ProducerConsumer();s3.start();}class Producer extends Thread {public void run() {while (true) {try {Object o = new Object();// 取出一个对象queue.put(o);System.out.println("Producer: " + o);} catch (InterruptedException e) {System.out.println("producer is interrupted!");}// }}}}class Consumer extends Thread {public void run() {while (true) {try {// 取出一个对象Object o = queue.take();System.out.println("Consumer: " + o);} catch (InterruptedException e) {System.out.println("producer is interrupted!");}// }}}}}
结论
三种方式原理一致,都是对独占空间加锁,阻塞和唤醒线程,第一种方式比较传统,第三种方式最简单,只需存储和取用,线程同步的操作交由LinkedBlockingQueue全权处理。
http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html
java实现生产者消费者问题(转)相关推荐
- Java多线程-生产者消费者问题(多个消费者多个生产者)
Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...
- 【Java】生产者消费者模型
[Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...
- java实现生产者消费者模式
一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直 ...
- 【Java】生产者消费者模式的三种实现
原文地址:https://blog.csdn.net/u010983881/article/details/78554671 前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内 ...
- 【Java】生产者消费者模式的实现
前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.这个 ...
- 基于JAVA的生产者消费者问题
一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...
- Java多线程生产者消费者调度实现
生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...
- java 生产者消费者_基于JAVA的生产者消费者问题
一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...
- 用Java解决生产者-消费者问题
当我们尝试多线程编程时,生产者-消费者问题是最常见的问题之一. 尽管不像多线程编程中的其他一些问题那样具有挑战性,但是错误地实现此问题可能会造成应用程序混乱. 生产的物品将不使用,开始的物品将被跳过, ...
最新文章
- SQL2000联机丛书:使用和维护数据仓库
- 电路非门_【连载】电路和维修基础之门电路、转换器
- Spy++的使用方法及下载
- openstack(Queens版) 安装FWaaS
- BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治
- 自动设置图片的序号_word表格技巧:如何在表格中填充序号并能自动更新
- thinkphp中__construct与_initialize()的区别
- 如何使用 ABAP 把多个文件打成一个 zip包 -利用 ABAP 标准工具类 cl_abap_zip
- python 爬取网页内容 snmp_python通过SNMP协议收集服务器监控信息
- AKKA HTTP 简单示例
- 深入了解AI在金融、能源领域的网络安全应用
- 2014阿里实习生面试题——mysql如何实现的索引
- Terrasolid安装与破解
- 超文本传输协议HTTP
- 基于Java毕业设计研究生招生信息管理源码+系统+mysql+lw文档+部署软件
- 华为云yum镜像源超慢改用阿里云镜像遇坑解决方法
- oracle 删除主键级联删除唯一索引
- 如何让DEDECMS织梦的TAGS标签静态化
- .NET C# 判断用户是手机访问还是电脑访问
- 电脑关机蓝屏,然后自动重启的问题解决。
热门文章
- IndexError: too many indices for array
- matlab0319
- PEAK6 2020校招OA
- Effective C#: Item 1 Always use properties instead of accessible data members
- C++ 重定位输入输出
- 2017 Multi-University Training Contest - Team 1—HDU6040
- WPF 支持分组互斥的 RadioButton 式单选菜单
- 获取文件名称的两个函数
- 邮箱数据库营销的概念及其特点介绍
- 找工作,我该如何是好?