线程协作工具类【CountDownLatch倒数门闩、Semaphore信号量、CyclicBarrier循环栏栅、Condition接口】
线程协作工具类
- CountDownLatch倒数门闩
- Semaphore信号量
- CyclicBarrier循环栅栏
- CyclicBarrier和CountDownLatch区别:
- Condition接口(条件对象)
转自 极客时间
线程协作工具类就是帮助程序员更容易的让线程之间进行协作,来完成某个业务功能。

CountDownLatch倒数门闩

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/*** CountDownLatch案例:6个程序猿加班* 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行*/
public class Demo11CountDownLatch {public static void main(String[] args) throws InterruptedException {//计数门闩CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <= 6; i++) {new Thread(()->{try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace(); }System.out.println(Thread.currentThread().getName() + "\t上完班,离开公司");countDownLatch.countDown();}, String.valueOf(i)).start();}new Thread(()->{try {countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t卷王最后关灯走人");} catch (InterruptedException e) {e.printStackTrace();}}, "7").start();}
}
Semaphore信号量

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;/*** Semaphore案例:三辆小汽车抢车位* Semaphore信号量主要作用:1.用于多个共享资源的互斥使用,2.用于并发线程数的控制*/
public class Demo12Semaphore {public static void main(String[] args) {//模拟资源类,有3个空车位Semaphore semaphore = new Semaphore(3);for (int i = 1; i <= 6; i++) {new Thread(()->{try{//占有资源semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t抢到车位");try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) {e.printStackTrace(); }System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位");} catch (Exception e) {e.printStackTrace();} finally {//释放资源semaphore.release();}}, "Thread-Car-"+String.valueOf(i)).start();}}
}
CyclicBarrier循环栅栏

import java.util.concurrent.CyclicBarrier;/*** 案例:集齐7龙珠召唤神龙*/
public class Demo13CyclicBarrier {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{System.out.println("======召唤神龙");});for (int i = 1; i <= 14; i++) {final int tempInt = i;new Thread(()->{try {System.out.println(Thread.currentThread().getName() + "\t收集到第" + tempInt + "颗龙珠");cyclicBarrier.await();System.out.println(Thread.currentThread().getName() + "\t第" + tempInt + "颗龙珠飞走了");} catch (Exception e) {e.printStackTrace();}}, "Thread-"+String.valueOf(i)).start();}}
}
CyclicBarrier和CountDownLatch区别:

Condition接口(条件对象)

import java.util.Collections;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 案例:Tony仨小哥洗剪吹* 演示多线程之间按顺序调用,实现A->B->C* 三个线程Tony要求如下:* tony雄雄-洗头,tony超超-理发,tony麦麦-吹干* 。。。* tony雄雄-洗头,tony超超-理发,tony麦麦-吹干* 依次来10轮*/
public class Demo14ConditionDemo {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(()->{for (int i = 0; i < 10; i++) {shareData.wash();}}, "tony-雄雄").start();new Thread(()->{for (int i = 0; i < 10; i++) {shareData.cut();}}, "tony-超超").start();new Thread(()->{for (int i = 0; i < 10; i++) {shareData.cook();}}, "tony-麦麦").start();}
}
class ShareData {private volatile int number = 1; //tony-雄雄:1, tony-超超:2, tony-麦麦:3private Lock lock = new ReentrantLock();private Condition c1 = lock.newCondition(); //number == 1private Condition c2 = lock.newCondition(); //number == 2private Condition c3 = lock.newCondition(); //number == 3/*** A线程每一轮要执行的操作*/public void wash() {lock.lock();try{//判断while(number != 1){c1.await();//阻塞}//模拟线程执行的任务System.out.println(Thread.currentThread().getName()+"-洗头");//通知number = 2;c2.signal();//唤醒了超超} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}/*** B线程每一轮要执行的操作*/public void cut() {lock.lock();try{//判断while(number != 2){c2.await();//阻塞}//模拟线程执行的任务System.out.println(Thread.currentThread().getName()+"-理发");//通知number = 3;c3.signal();//唤醒3} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void cook() {lock.lock();try{//判断while(number != 3){c3.await();}//模拟线程执行的任务System.out.println(Thread.currentThread().getName()+"-吹干");//通知number = 1;c1.signal();//唤醒雄雄} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}相关文章:
线程协作工具类【CountDownLatch倒数门闩、Semaphore信号量、CyclicBarrier循环栏栅、Condition接口】
线程协作工具类 CountDownLatch倒数门闩Semaphore信号量CyclicBarrier循环栅栏CyclicBarrier和CountDownLatch区别: Condition接口(条件对象) 转自 极客时间 线程协作工具类就是帮助程序员更容易的让线程之间进行协作,来完成某个业务功能。 CountDownLatch倒数门闩…...
Python 函数式编程进阶:map、filter、reduce
Python 函数式编程进阶:map、filter、reduce 介绍map 函数作用和语法使用 map 函数Lambda 函数的配合应用 filter 函数作用和语法使用 filter 函数Lambda 函数的结合运用 reduce 函数作用和语法使用 reduce 函数典型应用场景 介绍 在函数式编程中,map、…...
大模型|基础_word2vec
文章目录 Word2Vec词袋模型CBOW Continuous Bag-of-WordsContinuous Skip-Gram存在的问题解决方案 其他技巧 Word2Vec 将词转化为向量后,会发现king和queen的差别与man和woman的差别是类似的,而在几何空间上,这样的差别将会以平行的关系进行表…...
14.2 url后端过滤器(❤❤)
14.2 过滤器 1. 过滤器Filter1.1 配置形式实现过滤器1.2 过滤器生命周期1.3 过滤器特性(面试点)1.4 注解形式实现过滤器1.5 两种实现的选择2. 应用2.1 字符集过滤:统一设置请求与响应字节编码1. 配置方式实现过滤器参数化:init-param标签关键代码完整代码2. 注解方式实现2.2 多…...
Leetcode 377 组合总和 Ⅳ
题意理解: 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 这道题目和凑零钱是一样的,需要求使用指定元素(纸币…...
CleanMyMacX4.14.6如何清理mac垃圾内存
一直以来,苹果电脑的运行流畅度都很好,但是垃圾内存多了磁盘空间慢慢变少,还是会造成卡顿的。这篇文章就告诉大家电脑如何清理垃圾内存,电脑如何清理磁盘空间。 一、电脑如何清理垃圾内存 垃圾内存指的是各种缓存文件和系统垃圾…...
Java 学习和实践笔记(1)
2024年,决定好好学习计算机语言Java. B站上选了这个课程:【整整300集】浙大大佬160小时讲完的Java教程(学习路线Java笔记)零基础,就从今天开始学吧。 在这些语言中,C语言是最基础的语言,绝大多…...
【自然语言处理-工具篇】spaCy<1>--介绍及安装指南
目录 前言 安装指南 pip conda spaCy升级 总结 前言 spaCy是一个开源的自然语言处理库,用于处理和分析文本数据。它提供了许多功能,包括分词、词性标注...
LeetCode树总结
144. 二叉树的前序遍历 递归写法很简单,不再赘述。迭代写法需要用到一个栈,因为是根->左子树->右子树的顺序进行遍历,所以弹出当前结点后要先入栈右儿子,再入栈左儿子。 /*** Definition for a binary tree n…...
AI专题:冬渐去、春将来,待看,AI 开花,数据挂果,可控链潮起
今天分享的是AI 系列深度研究报告:《AI专题:冬渐去、春将来,待看,AI 开花,数据挂果,可控链潮起》。 (报告出品方:AVIC) 报告共计:36页 行业概览:2023年呈稳…...
Netty源码系列 之 EventLoop run()方法 源码
EventLoop[实现类为NioEventLoop,我们研究NioEventLoop即可] EventLoop是一个单线程的线程池 核心作用:处理执行IO操作(accept,read,write事件),普通任务,定时任务 EventLoop封装…...
ChatGPT 4.0 升级指南, ChatGPT Plus(GPT 4.0) 有何优势?
1.ChatGPT 是什么? ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人,它基于强大的语言处理模型 GPT(Generative Pre-trained Transformer)构建。它能够理解人类语言,可以为我们解决实际的问题。 ChatGPT 4.…...
springboot157基于springboot的线上辅导班系统的开发与设计
简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...
【机器学习】机器学习简单入门
🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:matplotlib 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...
考研数据结构笔记(1)
数据结构(1) 数据结构在学什么?数据结构的基本概念基本概念三要素逻辑结构集合线性结构树形结构图结构 物理结构(存储结构)顺序存储链式存储索引存储散列存储重点 数据的运算 算法的基本概念什么是算法算法的五个特性有…...
【深度学习理论】持续更新
文章目录 1.统计学习理论 1.统计学习理论 统计学习理论,一款适合零成本搞深度学习的大冤种的方向 从人类学习到机器学习的对比(学习的过程分为归纳和演绎 ),引出泛化和过拟合的概念。 如何表示归纳的函数规律呢?以监督…...
npm ERR! reason: certificate has expired(淘宝镜像过期)
npm ERR! request to https://registry.npm.taobao.org/yauzl/-/yauzl-2.4.1.tgz failed, reason: certificate has expired 今天在执行npm install命令时,报错百度了下是淘宝证书过期原因 解决方法一 执行下面两个命令再进行npm install即可 npm cache clean --…...
“极简壁纸“爬虫JS逆向·实战
文章目录 声明目标分析确定目标目标检索 代码补全完整代码 爬虫逻辑完整代码 运行结果 声明 本教程只用于交流学习,不可用于商业用途,不可对目标网站进行破坏性请求,请遵守相关法律法规。 目标分析 确定目标 获取图片下载链接 目标检索…...
Django通过Json配置文件分配多个定时任务
def load_config():with open("rule.json", rb)as f:config json.load(f)return configdef job(task_name, config, time_interval):# ... 通过task_name判断进行操作if task_name get_data_times:passdef main():config load_config()for task_name, task_value…...
C++ 搜索二叉树的删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回 要删除的结点可能分下面四种情况: a. 要删除的结点无孩子结点 b. 要删除的结点只有左孩子结点 c. 要删除的结点只有右孩子结点 d. 要删除的结点有左、右孩子结点 看起来有待删除节点有4中…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
