1.ReentrantLock实现

/*** 描述: 一个初始值为0的变量,两个线程对其交替操作,一个加一个减** @author xinjiao.yu@marketin.cn* @create 2020/2/22 11:55* @since 2.16.3*/
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();}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();}number--;System.out.println(Thread.currentThread().getName()+"\t"+number);// 通知唤醒condition.signalAll();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
}
public class ProConsumer_ReentrantLockDemo {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.BlockingQueue实现

class MyResource{private volatile boolean FLAG = true;private AtomicInteger atomicInteger = new AtomicInteger();private BlockingQueue<String> blockingQueue = null;// 构造方法注入public MyResource(BlockingQueue<String> blockingQueue){this.blockingQueue = blockingQueue;System.out.println(blockingQueue.getClass().getName());}public void myProd() 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+"失败");}TimeUnit.SECONDS.sleep(1);}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();return;}System.out.println(Thread.currentThread().getName()+"\t 消费队列"+result+"成功");}}public void myStop() throws Exception{this.FLAG=false;}
}
public class ProConsumer_BlockQueueDemo {public static void main(String[] args) throws Exception{MyResource myResource = new MyResource(new ArrayBlockingQueue<>(3));new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 生产者线程启动");try {myResource.myProd();} catch (Exception e) {e.printStackTrace();}},"Prod").start();new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 消费者线程启动");try {myResource.myConsumer();} catch (Exception e) {e.printStackTrace();}},"Consumer").start();// 暂停一会线程TimeUnit.SECONDS.sleep(5);System.out.println();System.out.println();System.out.println("5秒钟时间到,大老板main线程叫停,活动结束");myResource.myStop();}
}

生产者消费者ReentrantLock实现以及BlockingQueue实现相关推荐

  1. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  2. 【1】生产者-消费者模型的三种实现方式

    (手写生产者消费者模型,写BlockingQueue较简便 ) 1.背景                                                                 ...

  3. Java并发编程(二十三)------并发设计模式之生产者消费者模式

    参考文章:Java实现生产者消费者问题与读者写者问题 目录 1. 生产者消费者问题 1.1 wait() / notify()方法 1.2 await() / signal()方法 1.2.1 对sy ...

  4. 【生产者消费者模型】

    Linux生产者消费者模型 生产者消费者模型 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产者消费者模型 基于阻塞队列的生产者消费者模型 模 ...

  5. 【Linux篇】第十六篇——生产者消费者模型

    生产者消费者模型 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产消费者模型 基于阻塞队列的生产者消费者模型 模拟实现基于阻塞队列的生产消费模 ...

  6. Linux生产者消费者模型

    文章目录 生产者消费者模型 生产者消费者模型的概念 生产者消费者模型的特点 生产者消费者模型优点 基于BlockingQueue的生产者消费者模型 基于阻塞队列的生产者消费者模型 模拟实现基于阻塞队列 ...

  7. 【Linux入门】多线程(线程概念、生产者消费者模型、消息队列、线程池)万字解说

    目录 1️⃣线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程异常 Linux进程VS线程 2️⃣线程控制 创建线程 获取线程的id 线程终止 等待线程 线程分离 3️⃣线程互斥 进程线程间 ...

  8. Java多线程(十):BlockingQueue实现生产者消费者模型

    BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...

  9. 生产者-消费者中的缓冲区:BlockingQueue接口

    BlockingQueue接口使用场景 相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者- ...

最新文章

  1. go var type 互转_Go语言学习笔记(第九章) 结构体
  2. apache环境下配置服务器支持https
  3. 在NVIDIA Jetson Xavier NX上把yolov4-deepsort的模型pb模型使用tensorflow-onnx和onnx-tensorrt工具最终转换为tensorrt模型
  4. 如何用java+tomcat来创建网站服务器
  5. 好用的工具网站!(缓慢收集中!)
  6. 输出NSRange类型的数据
  7. 【数字信号】基于matlab GUI手机拨号音效模拟【含Matlab源码 909期】
  8. 【Hoxton.SR1版本】Spring Cloud Bus消息总线
  9. SSM框架整合环境搭建
  10. 全志F1C100s使用记录:资料索引与基础说明
  11. 用树形算法思想去使用思维导图\树形图\鱼骨图
  12. 关于利用背景减除法的固定摄像头的移动侦测算法
  13. shiro 原理简介
  14. intel服务器芯片组C,Intel C232芯片组 华硕P10S-C售2399元
  15. 收到短信:【淘会员】加微信免费赠礼品!是什么套路?这类短信如何发
  16. Microsoft Compatibility Telemetry占用系统cpu
  17. Hadoop安全认证(2)
  18. 面试造火箭,秋招建大楼!阿里新出《Java权威面试指南》堪称精品!
  19. PIN, PIN2, PUK, PUK2
  20. php - 发送qq邮箱信息

热门文章

  1. 搜搜/soso、有道、搜狗/sogou、雅虎/Yahoo、url 参数分析
  2. 同轴线传输网络摄像机信号2KM
  3. 单片机-硬件接口(UART/IIC/SPI/RS232/USB/CAN)异同
  4. 电脑批量加入域控制器脚本
  5. Amy-Tabb机器人世界手眼标定(4、Windows)
  6. LOJ2758 年轮蛋糕
  7. RF MEMS开关时代将开启-30?
  8. hive 正则表达式-regexp
  9. 边缘检测:更丰富的卷积特征 Richer Convolutional Features for Edge Detection
  10. hadoop配置过程中可能会出的问题localhost: root@localhost: Permission denied (publickey,password).