常用的Java线程阻塞业务方法

在Java中常常使用到多线程处理一些业务,但是也会遇到多线程处理时带来的业务逻辑时序不对问题,例如需要等待一个业务处理完或者下一步的逻辑需要等待多线程得到的结果,下面是几种常用的方法

  1. 使用 Thread.join() 方法
    对于已知的线程列表,可以遍历列表并调用每个线程的 join() 方法。join() 会让当前线程阻塞,直到指定的线程执行完毕。
List<Thread> threads = ...; // 创建并启动线程的列表for (Thread t : threads) {t.join(); // 当前线程(主线程)会等待t线程执行完毕
}// 这里所有的线程都已经执行完毕
System.out.println("All threads have finished.");
  1. 使用 CountDownLatch
    CountDownLatch 是一个计数器,允许一个或多个线程等待其他一组线程完成操作。初始化时设定一个计数值,每当一个任务完成时,调用 countDown() 方法使计数值减一。当计数值变为零时,所有等待在 await() 方法上的线程将被释放。
import java.util.concurrent.CountDownLatch;CountDownLatch latch = new CountDownLatch(NUM_THREADS); // 初始化计数器,NUM_THREADS为线程数量for (int i = 0; i < NUM_THREADS; i++) {Thread worker = new Thread(() -> {// 执行任务...latch.countDown(); // 任务完成,计数器减一});worker.start();
}latch.await(); // 主线程在此处等待,直到计数器归零(即所有任务完成)System.out.println("All threads have finished.");
  1. 使用 CyclicBarrier
    CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(即所有线程都到达)才继续执行。与 CountDownLatch 不同的是,它可以重用,并且在所有线程到达屏障时可以触发一个回调操作。
import java.util.concurrent.CyclicBarrier;CyclicBarrier barrier = new CyclicBarrier(NUM_THREADS, () -> {System.out.println("All threads have reached the barrier.");
});for (int i = 0; i < NUM_THREADS; i++) {Thread worker = new Thread(() -> {// 执行任务...try {barrier.await(); // 当前线程到达屏障点并阻塞,直到所有线程都到达} catch (InterruptedException | BrokenBarrierException e) {// 处理异常}});worker.start();
}
  1. 使用 ExecutorService 和 Future
    如果使用 java.util.concurrent.ExecutorService 来管理线程池,可以利用其提供的 shutdown() 和 awaitTermination() 方法来等待所有任务完成:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);// 提交任务到线程池
for (Runnable task : tasks) {executor.submit(task);
}executor.shutdown(); // 停止接收新任务,现有任务继续执行try {if (!executor.awaitTermination(TIMEOUT, TimeUnit.SECONDS)) { // 等待所有任务完成,超时抛出异常executor.shutdownNow(); // 尝试强制停止未完成的任务throw new TimeoutException("Tasks did not finish within the specified timeout.");}
} catch (InterruptedException e) {executor.shutdownNow(); // 当前线程被中断,尝试强制停止未完成的任务Thread.currentThread().interrupt(); // 重新设置中断状态
}System.out.println("All tasks have finished.");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python解释器安装路径查询以及版本查询

查询安装路径 1、利用脚本&#xff1a; 路径: import sys import osprint(当前 Python 解释器路径&#xff1a;) print(sys.executable)运行结果&#xff1a; 目录: print(当前 Python 解释器目录&#xff1a;) print(os.path.dirname(sys.executable))运行结果&#xff1a…

static+单例模式+类的复合继承

汇编语言 汇编语言是最靠谱的验证“编程语言相关知识点”正确性的方式 汇编语言与机器语言一一对应&#xff0c;每一条机器语言都有与之对应的汇编指令 机器语言是计算机使用的语言&#xff0c;它是一串二进制数字 汇编语言可以通过汇编得到机器语言机器语言可以通过反汇编得到…

设计模式—门面模式

定义: 门面模式,也称为外观模式&#xff0c;是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口&#xff0c;从而简化客户端与复杂子系统之间的交互。 在门面模式中&#xff0c;一个门面类充当中介&#xff0c;为客户端提供一个简化了的访问方式&…

基于Adaboost模型的数据预测和分类matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种集成学习方法&#xff0c;由Yoav Freund和Robert Schapire于1995年提出&#xff0c;主要用于提高弱分类…

【echarts】使用 ECharts 绘制3D饼图

使用 ECharts 绘制3D饼图 在数据可视化中&#xff0c;饼图是表达数据占比信息的常见方式。ECharts 作为一个强大的数据可视化库&#xff0c;除了标准的二维饼图&#xff0c;也支持更加生动的三维饼图绘制。本文将指导你如何使用 ECharts 来创建一个3D饼图&#xff0c;提升你的…

VScode配置launch+tasks[自己备用]

VScode配置launchtasks[自己备用]&#xff0c;配置文件详解 launch.json 字段 name &#xff1a;启动配置的名称&#xff0c;也就是显示在调试配置下拉菜单中的名字&#xff0c;如果添加了多个配置可以用此作为区分 字段 program &#xff1a;可执行文件完整路径。 ① 由于 C…

ARP代理

10.1.0.1/8 和10.2.0.1/8是在同一个网段 10.1.0.2/16 和10.2.0.2/16 不在同一个网段 10.1.0.1/8 和10.1.0.2/16 是可以ping通的 包发出来了&#xff0c;报文有发出来&#xff0c;目的地址是广播包 广播请求&#xff0c;发到路由器的接口G 0/0/0 target不是本接口&#xff0…

利用redis和fastapi实现本地与平台策略进行交互

redis在pandas一文有详细使用方法(一文教会pandas-CSDN博客)&#xff0c;具体可视化软件有redisstudio等。它是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络…

【教程】ubuntu20.04 下配置 Charm-crypto 0.5 实验环境

目录 前言先决条件基本依赖安装准备好 gcc&#xff0c;make 和 perl准备好 m4&#xff0c;flex&#xff0c;bison 和 libssl-dev安装 Python3.x&#xff0c;pip3 和 pyparsing 安装 OpenSSL安装 GMP5.x安装 PBC安装 Charm-crypto5.0安装开发环境检验 Charm-crypto5.0 安装成功参…

【【相机运动】_Camera_shake镜头晃动动画】

【相机运动】:Camera shake镜头晃动动画 2022-07-20 20:28 评论(0)

OpenCV轻松入门(八)——图片卷积

对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置&#xff0c;这个操作就叫卷积。 卷积需要4个嵌套循环&#xff0c;所以它并不快&#xff0c;除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波 图像滤波是尽…

怎么样在外网登录访问CRM管理系统?

一、什么是CRM管理系统&#xff1f; Customer Relationship Management&#xff0c;简称CRM&#xff0c;指客户关系管理&#xff0c;是企业利用信息互联网技术&#xff0c;协调企业、顾客和服务上的交互&#xff0c;提升管理服务。为了企业信息安全以及使用方便&#xff0c;企业…

智能零售:引领购物新时代

智能零售通过整合人工智能、物联网、大数据和机器学习等技术&#xff0c;正在彻底改变传统的购物模式&#xff0c;为消费者和零售商提供前所未有的效率和个性化体验。 智能零售利用消费者数据分析来提供个性化的购物推荐。无论是在线平台或是实体店内&#xff0c;智能系统都能…

【Redis 神秘大陆】008 常见Java客户端

八、Redis 的 Java 客户端 8.1 Jedis 连接池 单点连接池 Jedis 连接池基于 Common-Pool 连接池里面放置的是空闲连接&#xff0c;如果被使用 &#xff08;borrow&#xff09;掉&#xff0c;连接池就会少一个连接&#xff0c;连接使用完后进行放回 &#xff08;return&#…

【大语言模型】如何让ChatGPT等LLM拥有记忆

我们现在在跟ChatGPT等生成式人工智能聊天时&#xff0c;都需要我们给定一个上下文&#xff0c;生成式AI才会根据我们问题结合上下文给出回答&#xff0c;他们并没有任何记忆。想象一下未来我们有一个AI机器人在我们的身边&#xff0c;每天它的记忆都会归零&#xff0c;你必须跟…

基于afx透明视频的视觉增强前端方案

作者 | 青玉 导读 本文介绍了增长前端团队自研的Webview框架下透明视频视觉增强方案&#xff0c;该方案在保证对视觉进行高度还原的同时可投入更少的开发成本&#xff0c;还能获得更优的前端性能表现。文章首先分析了市面上动画方案的优缺点&#xff0c;然后详细介绍了透明视频…

【备忘】利用FFMpeg读取视频第一帧作为封面

前言 以前做过类似项目&#xff0c;当时是利用php 执行cli命令的方式去读取视频第一帧&#xff0c;现在2024年了服务器环境的升级再使用这种方式也不好了&#xff0c;现在用新的方式去实现这个简单的功能。&#xff08;有点困了不想写了&#xff09; 实现步骤 前提要先安装f…

开发语言漫谈-rust

前面介绍C语言家族时忘掉了rust&#xff0c;紧急补一篇。我们称C语言家族是指他们的语法相似&#xff0c;类似这样的&#xff1a; if(){}else{}就是C家族的。C、C的传统领域就是系统底层、硬件接口方向。C/C没有垃圾内存回收机制&#xff0c;完全靠程序员的自觉天赋&#xff0…

Blender生成COLMAP数据集

最近在做3DGS方向&#xff0c;整理了一下Blender生成自己的数据集。 1 Introduction 在Blender中构建场景&#xff08;light, object, camera&#xff09;&#xff0c;利用Blender的python脚本对其渲染&#xff0c;导出多视角下渲染出的RGB图和depth map&#xff0c;并将trans…

SpingBoot3相关

一、SpringBoot3-AOT与JIT介绍 1.1 AOT与JIT JIT&#xff08;Just-in-Time&#xff0c;实时编译&#xff09;Java跨平台的基础 AOT&#xff08;Ahead-of-Time&#xff0c;预编译或提前编译&#xff09;&#xff0c;无法跨平台 1.2 AOT的优点 启动和运行速度快&#xff1a;传…