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

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 < 3; 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

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论