当前位置: 首页 > news >正文

JUC并发工具---线程协作

信号量能被FixedThreadPool代替吗

Semaphore信号量

控制需要限制访问量的资源,没有获取到信号量的线程会被阻塞

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;public class SemahoreDemo {static Semaphore semaphore = new Semaphore(3);public static void main(String[] args) {ExecutorService service = Executors.newFixedThreadPool(50);for (int i = 0; i < 1000; i++) {service.submit(new Task());   }service.shutdown();}static class Task implements Runnable {@Overridepublic void run() {try {// 获取信号量semaphore.acquire();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "拿到了许可证,花费2s执行慢服务");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("慢服务" + Thread.currentThread().getName() + "执行完毕,释放了许可证");// 释放信号量semaphore.release();}}
}

注意点

  • 获取和释放的许可证数量尽量保持一致
  • 在初始化的时候可以设置公平性
  • 信号量是支持跨线程、跨线程池的,并且不是哪个线程获得到许可证,就必须由这个线程去释放。

CountDownLatch时如何安排线程执行顺序的

核心思想

等到一个设定的数值达到之后,才能出发。

用法

用法一:一个线程等待其他多个线程都执行完毕,再继续自己的工作

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CountDownLatchDemo1 {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(5);ExecutorService service = Executors.newFixedThreadPool(5);for (int i = 0; i < 5; i++) {final int no = i+1;Runnable runnable = new Runnable() {@Overridepublic void run() {try {Thread.sleep((long)(Math.random()*10000));System.out.println("Thread " + no + " is completed");} catch (InterruptedException e) {e.printStackTrace();}finally {// countDownLatch数量减一countDownLatch.countDown();}}};service.submit(runnable);}System.out.println("等待5个远动员都跑完...");// 等待countDownLatch中的数量减到某个阈值countDownLatch.await();System.out.println("5个远动员都跑完了,比赛结束");}
}

用法二:多个线程等待某一个线程的信号,同时开始执行

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CountDownLatchDemo2 {public static void main(String[] args) throws InterruptedException {System.out.println("远动员有5s的准备时间...");CountDownLatch countDownLatch = new CountDownLatch(1);ExecutorService service = Executors.newFixedThreadPool(5);for (int i = 0; i < 5; i++) {final int no = i+1;Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Thread " + no + " 开始准备完毕,等待裁判员的发号");try {// 等待countDownLatch减到某个阈值countDownLatch.await();System.out.println("Thread " + no + "运动员开始跑步");} catch (InterruptedException e) {e.printStackTrace();}}};service.submit(runnable);}Thread.sleep(5000);System.out.println("5秒准备时间已过,发令枪响,比赛开始");countDownLatch.countDown();;}
}

CyclicBarrier和CountDownLatch是有什么异同

相同点:都能阻塞一个或者一组线程,直到某种预定的条件达到之后,之前在等待的线程才会统一出发,继续向下执行。

不同点:

  • 作用对象不同,CyclicBarrier要等固定数量的线程都到达了栅栏位置才能继续执行,而CountDownLatch只需要等待数字倒数到0。CountDownLatch作用于事件,但CyclicBarrier作用于线程。CountDownLatch是在调用了countDown方法之后把数字倒数减1,而 CyclicBarrier是在某线程开始等待后把计数减1。
  • 可重用性不同,CountDownLatch在倒数到O并且触发门门打开后,就不能再次使用了,除非新建一个新的实例,而CyclicBarrier可以重复使用,并不需要重新新建实例,CyclicBarrier还可以随时调用reset方法进行重置。如果重置时有线程已经调用了await方法并开始等待,那么线程则会抛出BrokenBarrierException异常。
  • 执行动作不同,CyclicBarriar有执行动作barrierAction,而 CountDownLatch 没这个功能。

CyclicBarrier当预设数量的线程到达集结点之后,出发时,便会执行传入的Runnable对象。

import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {@Overridepublic void run() {System.out.println("所有线程到达栅栏,继续执行");}});for (int i = 1; i <= 3; i++) {final int threadNum = i;new Thread(new Runnable() {@Overridepublic void run() {try {System.out.println("线程" + threadNum + "开始执行");// 模拟任务执行Thread.sleep(1000);System.out.println("线程" + threadNum + "任务完成,等待其他线程");// await表示+1,也就是要等到3,才会执行cyclicBarrier中的runcyclicBarrier.await(); // 线程在此处等待其他线程} catch (Exception e) {e.printStackTrace();}}}).start(); // 启动线程}}
}

Condition、object.wait()和notify()的关系

Condition接口的作用

线程1需要等到某些条件满足后,才能继续运行,这个时候就要Condition的await方法,线程就会进入WAITING状态。

另外一个线程2,达到对应的条件,直到条件达成,线程2调用Condition的signal()或者signalAll(),表示“这个条件已经达成了,之前等待这个条件的线程现在可以苏醒了”,JVM会找到等待该Condition的线程,并予以唤醒根据调用的是signal方法或signalAll方法,唤醒1个或所有的线程

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class ConditionDemo {private ReentrantLock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void method1() throws InterruptedException {lock.lock();try {System.out.println(Thread.currentThread().getName() + ":条件不满足,开始await");condition.await();System.out.println(Thread.currentThread().getName() + ":条件满足了,开始执行后续的任务");} finally {lock.unlock();}}public void method2() throws InterruptedException {lock.lock();try {System.out.println(Thread.currentThread().getName() + ":需要5s的准备时间");Thread.sleep(5000);System.out.println(Thread.currentThread().getName() + ":准备工作完成,唤醒其它线程");// condition.signal()唤醒正在等待当前条件的线程condition.signal();} finally {lock.unlock();}}public static void main(String[] args) throws InterruptedException {ConditionDemo demo = new ConditionDemo();new Thread(new Runnable() {@Overridepublic void run() {try {demo.method2();} catch (InterruptedException e) {e.printStackTrace();}}}, "Thread-2").start();// 方法开始等待demo.method1();}
}

相关文章:

JUC并发工具---线程协作

信号量能被FixedThreadPool代替吗 Semaphore信号量 控制需要限制访问量的资源&#xff0c;没有获取到信号量的线程会被阻塞 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;public class Sem…...

Excel for Finance 08 `XNPV`和`XIRR` 函数

Excel 的 XNPV 函数用于计算基于特定日期的净现值&#xff08;Net Present Value, NPV&#xff09;。与标准的 NPV 函数相比&#xff0c;XNPV 更灵活&#xff0c;可以考虑不规则的现金流间隔&#xff0c;而不仅限于等间隔的期数。 语法&#xff1a; XNPV(rate, values, dates)…...

嵌入式入门Day35

网络编程 Day2 套接字socket基于TCP通信的流程服务器端客户端TCP通信API 基于UDP通信的流程服务器端客户端 作业 套接字socket socket套接字本质是一个特殊的文件&#xff0c;在原始的Linux中&#xff0c;它和管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号等…...

AE/PR/达芬奇模板:自动光标打字机文字标题移动效果动画模板预设

适用于AE/PR/达芬奇的 Typewriter Pro 该模板包括专业的打字机文本动画&#xff0c;并包含很酷的功能&#xff0c;以及帮助文档和分步画外音视频教程。 主要特点 轻松的持续时间控制您可以通过在持续时间控件中输入 start 和 end duration&#xff08;开始和结束持续时间&…...

RCE漏洞

一、课程知识点 1、远程代码执行漏洞原理与利用 2、常见的代码执行函数 3、常见的命令执行函数 4、常见的绕过姿势 5、命令执行漏洞防范 二、技术目标 1、掌握命令执行漏洞的原理 2、掌握 PHP 命令执行和代码执行的相关函数 3、掌握常见的绕过姿势 4、掌握代码执行漏洞防御措施…...

在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题

00 两种可行方法分别是&#xff1a; 使用数组存储每一位数据并进行进位运算&#xff1a;通过将大数按位拆分成数组&#xff0c;然后实现逐位加法、进位等操作。使用符号变量进行计算&#xff1a;将数值分成低位和高位&#xff0c;分别用符号变量进行计算。 01&#xff1a;使用…...

【Compose multiplatform教程20】在应用程序中使用多平台资源

为项目设置资源后&#xff0c;生成项目以生成提供资源访问权限的特殊类。要重新生成类和所有资源访问器&#xff0c;请再次生成项目或在 IDE 中重新导入项目。ResRes 之后&#xff0c;您可以使用生成的类从您的代码或外部库访问配置的多平台资源。 自定义访问器类生成 您可以使…...

深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent

阅读原文 渐入佳境 我们都知道&#xff0c;通过编写一个提示词&#xff08;prompt&#xff09;&#xff0c;我们可以引导大模型生成回答&#xff0c;从而开启愉快的人工智能对话&#xff0c;比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程&#xff0c;我们拆成两部分 pr…...

紫光同创-盘古200pro+开发板

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 一、开发系统介绍 开发系统概述 MES2L676-200HP 开发板采用紫光同创 logos2 系列 FPGA&#xff0c;型号&#xff1a;…...

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针-CSDN博客 类型含义使用场景示例nil表示一个指向 Objective - C 对象的空指针。在 Objective - C 和 Swift&#xff08;与 Objective - C 交互时&#xff09;中用于表示对象不存在。当一个对象变量没有指向任何有效的对象实例…...

【优选算法】有效三角形的个数(双指针算法)

优质专栏&#xff1a;算法_云边有个稻草人的博客-CSDN博客 目录 【611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;】 解法一&#xff1a; 解法二&#xff1a; 【611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09;】 解法一&#xff1a; 三层for…...

中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern)

中介者模式&#xff08;Mediator Pattern&#xff09;、桥接模式&#xff08;Bridge Pattern&#xff09; 和 策略模式&#xff08;Strategy Pattern&#xff09; 都是常见的设计模式&#xff0c;它们解决不同类型的问题。我们将通过 Swift 示例来说明它们的使用场景&#xff0…...

客户案例:基于慧集通打通聚水潭电商ERP与用友U8系统集成之路

一、引言 本原型客户是 生物科技公司&#xff0c;其公司系列抗菌抗病毒产品广泛应用于医疗用品、纺织服饰、家纺用品、母婴护理、女性用品、个人防护等多个领域。在知识产权方面&#xff0c;公司在专业领域已获得商标和专利近百项&#xff0c;创新能力得到了国家及行业内普遍认…...

阿里云clb是什么

传统型负载均衡服务 ‌阿里云CLB&#xff08;Classic Load Balancer&#xff09;是阿里云提供的一种传统型负载均衡服务&#xff0c;主要用于将访问流量根据转发策略分发到后端多台云服务器。‌‌ CLB的定义和功能 CLB是一种流量分发控制服务&#xff0c;通过设置虚拟服务地…...

【Cursor编辑器】自用经验和实操(迭代更新)

1.启动composer crtl I 2.生成直接一直问加载 3. 实操 生成个知识图谱&#xff0c;使用csv文件里面的数据创关系和节点。...

【学习笔记】ChatGPT原理与应用开发——基础科普

HuggingLLM&#xff08;ChatGPT原理与应用开发&#xff09; 原文链接&#xff1a;HuggingLLM&#xff08;ChatGPT原理与应用开发&#xff09;-课程详情 | Datawhale 此处仅为学习记录和总结 1&#xff1a;基础科普 1.1&#xff1a;自然语言背景 图灵测试 如果一个人&#x…...

基于Web的实验中心工作管理网站的设计与实现

写作任务 一、课题背景 实验中心承担了全校计算机公共基础课程和学院专业课程&#xff0c;需要对实验中心工作进行有效的管理。 二、课题任务 本课题设计和实现实验中心工作管理系统。 系统的主要内容包括&#xff1a; &#xff08;1&#xff09;人员管理&#xff1b; &am…...

docker 安装minio

docker pull minio/minio #启动 mkdir -p /root/minio/config mkdir -p /root/minio/datadocker run -d \--name minio \-p 9002:9000 \-p 9001:9001 \--restartalways \-v /root/minio/data:/data \-v /root/minio/config:/root/.minio \-e "MINIO_ACCESS_KEYminioadmin…...

ubuntu下ipmi的使用(4028)

参考ubuntu系统下配置IPMI_ubuntu ipmi-CSDN博客 参考&#xff1a;ipmitool ubuntu 安装_ipmi centos ubuntu使用总结-CSDN博客 1.安装 sudo apt-get -y install ipmitool 2.加载 modprobe ipmi_msghandlermodprobe ipmi_devintfmodprobe ipmi_si 3.使用,查看不到的话&am…...

周记-唐纳德的《计算机程序设计艺术》

用代码生成代码 开发一个协议&#xff0c;字段有些多&#xff0c;每个字段是QT的属性&#xff0c;需要写Q_PROPERTY&#xff0c;一个一个编辑的话比较繁琐&#xff0c;耗费时间。后来就用代码生成了头文件和源文件&#xff0c;get和set还有signal函数&#xff0c;内容基本都是…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...