Java多线程之线程通信之生产者消费者阻塞队列版
Java多线程之线程通信之生产者消费者传统版和阻塞队列版
目录
- 线程通信之生产者消费者传统版
- 线程通信之生产者消费者阻塞队列版
1. 线程通信之生产者消费者传统版
题目: 一个初始值为零的变量,两个线程对其交替操作,一个加1一个减1,来五轮
1.代码实现
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class ShareData { //资源类private int number = 0;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void increment() throws Exception {lock.lock();try {//1.判断while (number != 0) {//等待,不能生产condition.await();}//2.干活number++;System.out.println(Thread.currentThread().getName() + "\t" + number);//通知唤醒condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void decrement() throws Exception {lock.lock();try {//1.判断while (number == 0) {//等待,不能生产condition.await();}//2.干活number--;System.out.println(Thread.currentThread().getName() + "\t" + number);//通知唤醒condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}/*** 题目:* 一个初始值为零的变量,两个线程对其交替操作,一个加1一个减1,来五轮* <p>* 1. 线程 操作(方法) 资源类* 2. 判断 干活 通知* 3. 防止虚假唤醒*/
public class ProdConsumer_TraditionDemo {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(() -> {for (int i = 1; i <=5 ; i++) {try {shareData.increment();} catch (Exception e) {e.printStackTrace();}}},"AA").start();new Thread(() -> {for (int i = 1; i <=5 ; i++) {try {shareData.decrement();} catch (Exception e) {e.printStackTrace();}}},"BB").start();}
}
2.编译结果
2. 线程通信之生产者消费者阻塞队列版
题目: 一个初始值为零的变量,两个线程对其交替操作,一个加1一个减1,来五轮
1.代码实现
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;class MyResource {private volatile boolean FLAG = true; //默认开启,进行生产+消费private AtomicInteger atomicInteger = new AtomicInteger();BlockingQueue<String> blockingQueue = null;public MyResource(BlockingQueue<String> blockingQueue) {this.blockingQueue = blockingQueue;System.out.println(blockingQueue.getClass().getName());}public void myProdu() throws Exception {String data = null;boolean retValue;while (FLAG) {data = atomicInteger.incrementAndGet() + "";retValue = blockingQueue.offer(data, 2L, TimeUnit.SECONDS);if (retValue) {System.out.println(Thread.currentThread().getName() + "\t 插入队列" + data + "成功");} else {System.out.println(Thread.currentThread().getName() + "\t 插入队列" + data + "失败");}try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "\t 大老板叫停了,表示FLAG=false,生产动作结束");}public void myConsumer() throws Exception {String result = null;while (FLAG) {result = blockingQueue.poll(2L, TimeUnit.SECONDS);if (null == result || result.equalsIgnoreCase("")) {FLAG = false;System.out.println(Thread.currentThread().getName() + "\t 超过2秒钟没有取到蛋糕,消费退出");System.out.println();System.out.println();return;}System.out.println(Thread.currentThread().getName() + "\t 消费队列蛋糕" + result + "成功");}}public void stop()throws Exception{this.FLAG = false;}
}/****/
public class ProdConsumer_BlockQueueDemo {public static void main(String[] args) throws Exception {MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));new Thread(() -> {System.out.println(Thread.currentThread().getName() + "\t 生产线程启动");try {myResource.myProdu();} catch (Exception e) {e.printStackTrace();}}, "Prod").start();new Thread(() -> {System.out.println(Thread.currentThread().getName() + "\t 消费线程启动");System.out.println();System.out.println();try {myResource.myConsumer();System.out.println();System.out.println();} catch (Exception e) {e.printStackTrace();}}, "Consumer").start();try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println();System.out.println();System.out.println();System.out.println("5秒钟时间到,大老板main线程叫停,活动结束");myResource.stop();}
}
- 执行结果
Java多线程之线程通信之生产者消费者阻塞队列版相关推荐
- 线程通信之生产者消费者阻塞队列版
线程通信之生产者消费者阻塞队列版 ProdConsumer_BlockQueueDemo.java import java.util.concurrent.ArrayBlockingQueue; im ...
- Java多线程(实现多线程、线程同步、生产者消费者)
1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...
- JAVA入门基础进阶(十四)—— 实现多线程、线程同步、生产者消费者
文章目录 1.实现多线程 1.1简单了解多线程[理解] 1.2并发和并行[理解] 1.3进程和线程[理解] 1.4实现多线程方式一:继承Thread类[应用] 1.5实现多线程方式二:实现Runnab ...
- Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者
文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...
- 多线程-线程通信:生产者消费者例题
/*** 线程通信的应用:经典例题:生产者/消费者问题** 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,* 店员一次只能持有固定数量的产品( ...
- 生产者消费者_【线程通信】生产者消费者模型
1生产者消费者模型介绍 生产者消费者模型,是每一个学习多线程的的人都需要知道的模型; 大致情况就是:有两个线程,一个负责生产产品,一个消费产品,两者公用同一块内存区域,也就是产品放在了同一块内存上面, ...
- java多线程并发之旅-09-java 生产者消费者 Producer/Consumer 模式
生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...
- Java多线程基础-9:代码案例之阻塞队列
阻塞队列是一种特殊的队列,带有"阻塞特性",也遵守队列 "先进先出" 的原则.阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻 ...
- Java多线程学习二十三:什么是阻塞队列
阻塞队列的作用 阻塞队列,也就是 BlockingQueue,它是一个接口,如代码所示: public interface BlockingQueue<E> extends Queue&l ...
最新文章
- Ubuntu 打 deb 包报错(fpm not found、dos2unix not found)
- COM:根系-土壤-微生物互作
- 【Python】特征工程:数值特征的缩放与编码
- ssm整合之四 分页
- oracle数据库inactive状态session过多的原因定位
- jQuery.extend()
- Android插件框架VirtualAPK学习和使用
- 通过exe解决kindle for pc中文书籍无法修改字体的问题
- Object 转int
- Ubuntu社区及其论坛
- ExecutorService的shutdownNow方法注意事项
- 机器码怎么改?笔记本机器码怎么改?(最新你看你也会)
- 小样本点云深度学习库_基于点云深度学习的点云数据集制作系统及方法与流程...
- 2013年国模 B题 碎纸片拼接
- 房租分期业务系统-抓住新的市场机遇
- cobbler一键装机流程
- 【华为OD机试 2023最新 】找数字、找等值元素(C++ 100%)
- 我是才学网络工程的,希望各位多多支持
- 最强PostMan使用教程(6)- 使用Postman导入swagger OPEN API
- TCS3200的使用
热门文章
- VS2010+WinXP+MFC程序 无法定位程序输入点于动态链接库
- typedef和函数指针定义
- 介绍一款JavaScript播放器 - Dewplayer
- Python问答环节(2)
- Ubuntu Linux 永山(mount)分
- centos 7 安装 google chrome 浏览器 (不是教程,只是为了以后自己可能用到)
- 国内云存储产品应用简介
- CodeForces - 1327E Count The Blocks(组合数学)
- POJ - 4045 Power Station(树形dp/树的重心)
- uva 816(经典bfs例子)