ProdConsTradiDemo.java

package thread;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 初始值为0的变量,两个线程交替操作,一个+1,一个-1,执行五轮* 1 线程  操作  资源类* 2 判断  干活  通知* 3 防止虚假唤醒机制*/
public class ProdConsTradiDemo {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(() -> {for (int i = 0; i < 5; i++) {try {shareData.increment();} catch (Exception e) {e.printStackTrace();}}}, "Producer").start();new Thread(() -> {for (int i = 0; i < 5; i++) {try {shareData.decrement();} catch (Exception e) {e.printStackTrace();}}}, "Consumer").start();}
}class ShareData {private int number = 0;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void increment() throws InterruptedException {lock.lock();try {//1 判断while (number != 0) {//等待,不能生产condition.await();}//2 干活number++;System.out.println(Thread.currentThread().getName() + "\t" + number);//3 通知唤醒condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void decrement() throws InterruptedException {lock.lock();try {//1 判断while (number == 0) {//等待,不能生产condition.await();}//2 干活number--;System.out.println(Thread.currentThread().getName() + "\t" + number);//3 通知唤醒condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}



多线程的条件判断 一定要用while,而不要用 if

阻塞队列的应用 || 多线程的条件判断 一定要用while,而不要用 if相关推荐

  1. 【多线程】阻塞队列的C++多线程 实现 BlockingQueue

    阻塞队列在存放和获取队列中的数据时需要使用多线程,一个线程专门负责向队列中存放元素,另一个线程专门从队列中获取元素.也可多开辟跟多的线程进行存取. 规范的方法也正是存放和获取队列元素分别在不同的线程中 ...

  2. Java集合--阻塞队列(LinkedBlockingQueue)

    Java集合–阻塞队列(LinkedBlockingQueue) 1. LinkedBlockingQueue LinkedBlockingQueue是一个使用链表实现的阻塞队列,支持多线程并发操作, ...

  3. 线程和并发(三)阻塞队列和线程池

    concurrent之atomic相关 概述 java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实 ...

  4. c++实现的阻塞队列

    阻塞队列(block_queue) 什么是阻塞队列: 在多线程编程时当有多个线程访问一个队列时如果队列为空,则获取队列中元素的方法就会阻塞,直到队列中有元素可以获取 解决的问题: 队列的线程安全问题 ...

  5. java阻塞队列小结

    [README] 1,本文介绍了java的7个阻塞队列: 2,阻塞队列的作用 做缓冲作用,如缓冲kafka消息,而不是直接发送给kafka,减少kafka集群的压力: [1]阻塞队列 Blocking ...

  6. Java多线程基础-9:代码案例之阻塞队列

    阻塞队列是一种特殊的队列,带有"阻塞特性",也遵守队列 "先进先出" 的原则.阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻 ...

  7. JAVA多线程-常用JUC工具类及阻塞队列

    工具类 CountDownLactch 简述 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成,同步辅助. CountDownLatch 类用给定的计数初始化. await 方法阻塞,直到由 ...

  8. 详细讲解 —— 多线程的四个案例、单例模式、阻塞队列、定时器、线程池(Java EE初阶)(万字长文)

    多线程 1 wait和notify 1.1 wait()方法 1.2 notify()方法 \ notifyAll()方法 1.3 wait 和 sleep 的对比(面试题) 2. 多线程案例 2.1 ...

  9. python线程池阻塞队列_福利又来啦!python多线程进阶篇

    使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...

最新文章

  1. Leangoo思维导图管理用户故事
  2. 软件技术基础_软件技术(游戏软件开发)专业介绍
  3. linux启动spark命令,在linux上安装spark
  4. 网易视频云分享:流媒体技术介绍(上篇)
  5. linux删除了mount目录,Linux记录-分区(df/fdisk/mount/umount/fuser)
  6. gitlab访问慢,出现502,特别卡,耗内存cpu解决办法
  7. WordPress主题 RiPro v5.0高级付费素材资源类主题
  8. _报告指出:黑客已将攻击的目标逐渐迁移到 Linux 服务器和工作站上
  9. C# 生成验证码 方法一
  10. Java实现一个字符串的反转
  11. eclipsevue代码怎么运行_打了多年的单片机调试断点到底应该怎么设置? | 颠覆认知...
  12. vscode 模拟本地服务器打开文件,设置默认浏览器为chrome
  13. Linux fstab配置文件详解
  14. 当下热门的报表统计系统排行榜
  15. 互联网大脑进化简史,类脑智能巨系统产生与兴起
  16. 买笔记本电脑必须知道的事情
  17. 支付宝支付学习:蚂蚁沙箱环境是什么?怎样使用蚂蚁沙箱环境?
  18. Docker学习十:网络
  19. C语言简单程序——解二元一次方程
  20. 在职研究生读计算机专业,读计算机专业在职研究生让我择业自如高升有望

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第1节 继承_2_继承的格式
  2. 整理面试中的逻辑思维题
  3. 解决jquey中当事件嵌套时,内层事件会执行多次的问题
  4. 【转】python删除小记
  5. js下载文件及命名(兼容多浏览器)
  6. siteMap与站点导航
  7. Android init.rc如何启动service去执行sh脚本
  8. python3邮件_python3使用SMTP发送HTML格式邮件
  9. python软件加密、固定机器使用_如何用Python进行最常见的加密操作?(附最新400集Python教程)...
  10. 经典动态规划之过河卒【洛谷 P1002】