多线程之CountDownLatch工具类详解编程语言
2023-06-13 09:20:29 时间
CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。
CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个await。
使用场景:
可以实现一个人(也可以是多个人)等待其他所有人来通知他,也可以实现一个人通知多个人。
类似裁判一声口令,所有运动员开始跑步,所有运动员到达终点后需要裁判员报告成绩,裁判员公布结果。
实现如下:
package andy.thread.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; * @author Zhang,Tianyou * @version 2014年11月9日 下午2:34:34 public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final CountDownLatch cdOrder = new CountDownLatch(1); final CountDownLatch cdAnswer = new CountDownLatch(3); for (int i = 0; i i++) { Runnable runnable = new Runnable() { public void run() { try { System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令"); cdOrder.await(); System.out.println("线程" + Thread.currentThread().getName() + "已接受命令"); Thread.sleep((long) (Math.random() * 10000)); System.out .println("线程" + Thread.currentThread().getName() + "回应命令处理结果"); cdAnswer.countDown(); } catch (Exception e) { e.printStackTrace(); service.execute(runnable); try { Thread.sleep((long) (Math.random() * 10000)); System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令"); cdOrder.countDown(); System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果"); cdAnswer.await(); System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果"); } catch (Exception e) { e.printStackTrace(); service.shutdown(); }
运行结果如下:
线程pool-1-thread-2正准备接受命令
线程pool-1-thread-1正准备接受命令
线程pool-1-thread-3正准备接受命令
线程main即将发布命令
线程main已发送命令,正在等待结果
线程pool-1-thread-3已接受命令
线程pool-1-thread-2已接受命令
线程pool-1-thread-1已接受命令
线程pool-1-thread-1回应命令处理结果
线程pool-1-thread-2回应命令处理结果
线程pool-1-thread-3回应命令处理结果
线程main已收到所有响应结果
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10762.html
cjava相关文章
- [Python 爬虫]煎蛋网 OOXX 妹子图爬虫(2)——多线程+多进程下载图片
- Golang|一个简单的多线程批量url存活扫描工具
- phpMyAdmin多线程破解工具
- 多线程——NSThread
- Oracle 12c 多线程数据库操作 的新特性详解
- Linux多线程通信:实现并发任务共享(linux多线程通信)
- GFTP是X Window下的一个用Gtk开发的多线程FTP客户端工具,它与Microsoft Windows下运行的CuteFTP等FTP工具极为类似。
- 【教程】linux下C语言多线程入门指南(linuxc多线程教程)
- 多线程主题:Linux下XCB多线程编程的探索(xcblinux)
- 多线程Redis开启更高效的数据存储(有多线程的redis)
- 多线程Redis更适合大型分布式系统(多线程redis 版本)
- 利用Redis实现多线程访问过期数据(redis过期 多线程)
- Redis过期处理多线程处理优化(redis过期 多线程)
- redis过期管理之多线程优化(redis过期 多线程)
- 使用Redis和多线程有效预防过期(redis过期 多线程)
- 多线程爬虫批量下载pcgame图片url保存为xml的实现代码
- java多线程编程之使用Synchronized块同步方法