java中的生产者消费者模式详解
方式 一: Synchronized方式
注:此种方式会造成资源的浪费:
利用锁的notifyAll()方法会将所有的线程都唤醒,会造成资源的浪费
class Resource {private String name;private int count = 1;private boolean flag = false;public synchronized void set(String name) {/*对于多个生产者和消费者,为什么要用while来判断标记?原因: 让要被唤醒的线程再判断一次标记,因为现在的标记可能已经不是它原来等待时的状态了*/while (flag) { try {this.wait();} catch (Exception e) {}}this.name = name + "--" + count++;System.out.println(Thread.currentThread().getName() + "...Producer..." + this.name);this.flag = true;/*为什么要用notifyAll()因为需要唤醒对方的线程,如果只用notify()的方式有可能出现只唤醒本方线程的情况导致程序中的所有线程都处于等待的状态下!!!*/this.notifyAll();}public synchronized void out() {while (!flag) {try {this.wait();} catch (Exception e) {}}System.out.println(Thread.currentThread().getName() + ".....Consumer....." + this.name);this.flag = false;this.notifyAll();}
}class Producer implements Runnable {private Resource r;public Producer(Resource r) {this.r = r;}public void run() {while (true) {r.set("+Items+");}}
}class Consumer implements Runnable {private Resource r;public Consumer(Resource r) {this.r = r;}public void run() {while (true) {r.out();}}
}public class ProducerAndConsumer {public static void main(String[] args) {Resource r = new Resource();new Thread(new Producer(r)).start();new Thread(new Producer(r)).start();new Thread(new Consumer(r)).start();new Thread(new Consumer(r)).start();}
}
方式二:
利用Lock的方式显示的声明锁
这种方式可以人唤醒想要唤醒的线程,能够减少资源的浪费
/*JDK1.5中提供了多线程中锁的升级解决方案:将同步中的Synchronized替换成显式的lock操作一个锁可以对应多个Condition对象将object中的wait()、notify()、notifyAll()等方法替换成了Condition对象拥有的方法Condition对象通过lock锁的newCondition()方法来获取。不同类型的线程用不同的Condition对象来实现线程状态的切换,以达到对不同类型的线程进行不同的操作的目的例如:下面的示例中用condition对象来对生产者的线程进行操作,用conditionPro对象来对消费者的线程进行操作,这样就可以实现生产者的线程只唤醒消费者,消费者的线程只唤醒生产者,减少资源的浪费。即两种类型的线程用的同一把锁,但是用的不同的Condition对象,这样就可以实现本方只唤醒对方的线程的操作。*/
import java.util.concurrent.locks.*;class Resource {private String name;private int count = 1;private boolean flag = false;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();private Condition conditionPro = lock.newCondition();public void set(String name) throws InterruptedException {lock.lock();try {while (flag)condition.await();this.name = name + "--" + count++;System.out.println(Thread.currentThread().getName() + "...Producer..." + this.name);this.flag = true;conditionPro.signal();} finally {lock.unlock(); // 释放锁的动作一定要执行,否则会造成抛异常之后不释放锁,别的线程拿不到锁}}public void out() throws InterruptedException {lock.lock();try {while (!flag)conditionPro.await();System.out.println(Thread.currentThread().getName() + ".....Consumer....." + this.name);this.flag = false;condition.signal();} finally {lock.unlock();}}
}class Producer implements Runnable {private Resource r;public Producer(Resource r) {this.r = r;}public void run() {while (true) {try {r.set("+Items+");} catch (InterruptedException e) {}}}
}class Consumer implements Runnable {private Resource r;public Consumer(Resource r) {this.r = r;}public void run() {while (true) {try {r.out();} catch (InterruptedException e) {}}}
}public class ProducerAndConsumer {public static void main(String[] args) {Resource r = new Resource();new Thread(new Producer(r)).start();new Thread(new Producer(r)).start();new Thread(new Consumer(r)).start();new Thread(new Consumer(r)).start();}
}
java中的生产者消费者模式详解相关推荐
- Java多线程(含生产者消费者模式详解)
多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...
- 单线程下的生产者--消费者模式详解,wait和sleep的区别
1. 单线程下的生产者--消费者模式 1.1 该模式下,一个线程生产数据,另一个线程处理数据.当数据还没被处理,那么生产数据的线程进入等待状态:如果数据还没生产,那么处理数据的线程进入等待状态,代码及 ...
- 生产者消费者模式详解(转载)
★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理 ...
- java consumed_Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者) ...
- Java中的异常和处理详解
Java中的异常和处理详解 参考文章: (1)Java中的异常和处理详解 (2)https://www.cnblogs.com/lulipro/p/7504267.html 备忘一下.
- Java中Lambda表达式使用及详解
Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...
- Java线程实现生产者—消费者模式
在这里插入代码片# Java 线程实现生产者-消费者模式 ##思路:实现类似消费者生产者线程之间通讯的功能,每创建一个工人,就让这个工人干活,干一段时间,工人自动消失,然后又去创建一个工人干活: 代码 ...
- 从java多态到策略模式_设计模式中的多态——策略模式详解
2. 策略模式详解 2.1 策略模式定义 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户端而独立的变化. 可以使用多态进行类比来理解策略模 ...
- Java线程实现生产者消费者模式
1 什么是生产者消费者模式 想一个现实生活中的例子,啤酒商---超市---消费者也就是我们,啤酒商生产了啤酒,然后将啤酒销售给了超市,我们消费之又会到超市将啤酒买回来自己喝,那么啤酒商和消费者之间是什 ...
最新文章
- 【转】独家教程:用PHP编写Android应用程序
- Redis五种数据类型详解
- 算法导论 算法_算法导论
- 数据科学:Oracle 并购 DataScience 公司提升机器学习能力
- Serverless会使 SaaS 商业模式过时,而开源将成为新的王者
- filebeat配置介绍
- 使用CSS创建Digg样式风格的导航栏或菜单
- 韶关python培训班_韶怎么读有什么意思 带韶字名字推荐(图文)
- Web版本的国际通讯工具合集
- 从写方案到见投资人,一步步教你如何拿投资
- bzoj 2827 千山鸟飞绝 平衡树
- 《网蜂A8实战演练》——11.Linux 电容式触摸屏驱动
- 原来学Python最好的书是这一本?它在bookauthority里排名第三
- 数据挖掘入门学习心得
- AVS2的GB帧与s帧
- Linux下文件备份和同步的工具软件
- Apache Storm 官方文档 —— Trident API 概述
- Oracle 计算表中的时间与当前时间差
- 学习路之html--扒取整站网页----扒站神器(Mac版跟window版)
- 服务器被一堆系统登录_饥荒联机云服务器开档
热门文章
- python点击按钮改变图片_单击tkinter按钮时更改图片
- 无法从传输连接中读取数据:远程主机强迫_电力远程抄表中的应用
- 计算机毕业设计谢辞怎么写,毕业论文谢辞怎么写(通用8篇)
- Python HTMLCalendar类| 带有示例的formatyearpage()方法
- 面经 | 我是如何拿到阿里offer的?附面试题+视频
- MFC:2个重载中没有一个可以转换所有参数类型
- OpenStack-Mitaka 一键安装测试环境脚本
- windows下配置caffe-matlab接口
- vmware安装渗透系统 Linux Kail最新版
- mysql 视图 教程_MySQL视图简介及基本操作教程