zl程序教程

您现在的位置是:首页 >  后端

当前栏目

多线程之CountDownLatch工具类详解编程语言

多线程工具编程语言 详解 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