7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...
1 /* 2 * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) 3 * */ 4 public class TestProductorAndConsumerForLock { 5 public static void main(String[] args) { 6 WareHouse wareHouse = new WareHouse(); 7 Productor pd1 = new Productor(wareHouse); 8 Consumer cs1 = new Consumer(wareHouse); 9 10 new Thread(pd1, "消费者1").start(); 11 new Thread(cs1, "生产者1").start(); 12 // 若有多个 生产者消费者,可能会产生虚假唤醒(缺货了,多个生产线程等待,唤醒时,这些生产线程同时醒来,对数据进行操作,这种问题叫做虚假唤醒) 13 // 解决办法:wait方法 尽量 使用在循环中,被唤醒之后,再去判断是否符合条件(库存是否达到上限),不符合条件 14 // 继续等待(等待消费者去消费商品),直到 条件符合(库存有空闲) 15 new Thread(pd1, "消费者2").start(); 16 new Thread(cs1, "生产者2").start(); 17 } 18 } 19 20 // 仓库 21 class WareHouse { 22 // 商品数量 23 private int products = 0; 24 private ReentrantLock lock = new ReentrantLock(); 25 //使用 Condition 的前提是 使用 Lock 同步锁,Condition 实例 实质上被绑定到一个锁上 26 private Condition condition = lock.newCondition(); 27 28 public void set() { 29 lock.lock(); 30 try { 31 while (products >= 1) { 32 System.out.println("商品库存满了"); 33 try { 34 // 如果商品满了,阻塞线程,等待消费者线程消费完成后唤醒, 35 condition.await(); //相当于(Object.awatit() 但是功能更强大) 36 } catch (InterruptedException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 } 41 System.out.println("生产了商品,剩余库存" + ++products); 42 condition.signalAll(); //相当于 (Object.notifyAll,功能更强大) 43 } finally { 44 lock.unlock(); 45 } 46 47 } 48 49 public void get() { 50 lock.lock(); 51 try { 52 while (products <= 0) { 53 System.out.println("商品库存没了"); 54 try { 55 // 如果商品没了,阻塞线程,等待生产者线程生产完成后唤醒, 56 condition.await(); 57 } catch (InterruptedException e) { 58 // TODO Auto-generated catch block 59 e.printStackTrace(); 60 } 61 } 62 System.out.println("消费了商品,剩余库存" + --products); 63 condition.signalAll(); 64 } finally { 65 lock.unlock(); 66 } 67 68 } 69 } 70 71 // 生产者 72 class Productor implements Runnable { 73 private WareHouse wareHouse; 74 75 public Productor(WareHouse wareHouse) { 76 this.wareHouse = wareHouse; 77 } 78 79 @Override 80 public void run() { 81 for (int i = 0; i < 20; i++) { 82 try { 83 Thread.sleep(200); 84 } catch (InterruptedException e) { 85 // TODO Auto-generated catch block 86 e.printStackTrace(); 87 } 88 wareHouse.get(); 89 } 90 } 91 92 } 93 94 // 消费者 95 class Consumer implements Runnable { 96 private WareHouse wareHouse; 97 98 public Consumer(WareHouse wareHouse) { 99 this.wareHouse = wareHouse; 100 } 101 102 @Override 103 public void run() { 104 for (int i = 0; i < 20; i++) { 105 106 wareHouse.set(); 107 } 108 } 109 110 }
转载于:https://www.cnblogs.com/xuzekun/p/7429123.html
7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...相关推荐
- 生产者消费者模型之lock版本(JAVA)
生产者消费者模型之lock版本 package com.company.run;import java.util.LinkedList; import java.util.concurrent.loc ...
- java同步锁实例_Java lock同步锁使用实例解析
这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1)Lock是一个接口,而synchroniz ...
- Java实现生产者消费者案例
目录 一.生产者消费者模式概述 二.生产者消费者案例 三.代码 奶箱类(Box): 生产者类(Producer): 消费者类(Customer): 测试类(BoxDemo): 四.运行结果 一.生产者 ...
- 生产者-消费者模式的三种实现方式
2.生产者-消费者模式的三种实现方式 1.背景 生产者生产数据到缓 ...
- 基于Lock的卖票和生产者消费者案例
1.三个售票员卖出30张票 线程 操作(对外暴露的调用方法) 资源类 2.生产者消费者问题 题目:现在两个线程,可以操作初始值为零的一个变量,实现一个线程对该变量加1,一个线程对该变量减1,实现交替, ...
- 生产者消费者案例java代码
大纲:java线程知识体系 一.概念 生产者消费者问题也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了共享固定大小缓冲区的两个线程--即所 ...
- 生产者-消费者 领导者-追随者 半同步-半异步
转载自:http://blog.csdn.net/henuyx/article/details/39458215 都是概念问题,实现并不是什么难事,网上示例一搜一大堆. 一. 生产者-消费者模型 ht ...
- Lock同步锁--线程同步
Lock-同步锁 Lock是java5提供的一个强大的线程同步机制--通过显示定义同步锁对象来实现同步.Lock可以显示的加锁.解锁.每次只能有一个线程对lock对象加锁. Lock有ReadLock ...
- 一个简单的生产者消费者案例
生产者消费者模式 为什么要引入生产者消费者模式 简单来说就是为了解决多线程下程序先后执行问题 遇到的例:实际生产中出现的场景 服务D依赖于服务A.B.C产生的数据,服务D必须等待A.B.C产生结果并持 ...
最新文章
- 【MySQL】(图解)快速理解内连接、外连接、左连接、右连接
- php 报错乱码,thinkphp3 phpexcel 导出报错乱码清除ob
- 基于Apache Spark的机器学习及神经网络算法和应用
- ktt算法 约化_推荐系统的多目标优化(4)-PE-LTR
- Laravel项目上传github后,clone到本地运行时报错500的解决方法
- bootstrap -- 一个标签中,同时有 col-xs , col-sm , col-md , col-lg
- Android 图形架构
- Mac OS使用技巧之十三:Finder中标记的使用
- 牛客题霸 [栈和排序] C++题解/答案
- C++ new和malloc的区别
- 解决 ubuntu出现的 cd Do-bash: cannot create temp file for here-document: Permission denied问题
- linux安装tomcat后启动报错Cannot find ./catalina.sh的解决方法
- ng机器学习视频笔记(三) ——线性回归的多变量、特征缩放、标准方程法
- vue 鼠标点击事件_点击鼠标,利用VBA代码实现精准控制触发事件的第二方案
- jQuery动态星级评分效果实现方法
- linux svn服务器同步,Linux服务器实现SVN与WEB同步解决方案
- 网络PXE启动WinPE,支持UEFI和LEGACY引导
- Nature Neuroscience(一)
- 我的c盘为多余的java.exejavaw.exe_java.exe,javac.exe,javaw.exe 是什么进程?
- 简易个人所得税计算器
热门文章
- 什么是jquery_什么是jQuery?
- JavaScript基础-基本数据类型和基本流程控制
- matlab的findpeak 极点查找
- linux三剑客之awk必杀技一例 linux命令
- [鸟哥linux视频教程整理]03_03_bash特性详解续
- ps -ef|grep httpServer|grep -v grep|cut -c 9-15|xargs kill -9
- plist文件中iphone和ipad的应用图片设置
- ASP.NET MVC 3.0学习系列文章(开始学习MVC)
- 【字符串替换】程序员面试金典——1.4空格替换
- 剑指offer——面试题3:二维数组中的查找