ConCurrent包下工具类-CountDownLatch

来源:互联网 发布:淘宝专业模板宝贝装修 编辑:程序博客网 时间:2024/06/06 09:31

CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器,CountDownLatch通过构造函数传入一个初始计数值,调用者可以通过调用CounDownLatch对象的cutDown()方法,来使计数减1;如果调用对象上的await()方法,那么调用者就会一直阻塞在这里,直到别人通过cutDown方法,将计数减到0,才可以继续执行。
常用于监听某些初始化操作,等待初始化完毕之后通知主线程继续工作.或者有一个线程需要等待其他线程完成之后才能执行

    public class CountDownLatchTest {    public static void main(String[] args) {         /**          * 1.创建一个CountDownLatch对象,设置需要等待线程的计数器          * 2.创建三个线程t1,t2,t3.t1线程需要等待t2,t3执行完成之后再继续执行          * 3.在t1线程执行时调用await()来等等待t2,t3执行完成          * 4.在t2,t3执行时调用countDown()通知t1线程开始执行,即计数器减一          * 5.当t2,t3都执行完成时t1开始执行          */         final CountDownLatch countDown = new CountDownLatch(2);         Thread t1 = new Thread(new Runnable() {            @Override            public void run() {                try {                    System.out.println("进入t1线程,等待其他线程处理完成");                    countDown.await();                    System.out.println("t1线程继续执行");                } catch (Exception e) {                    e.printStackTrace();                }            }        });         Thread t2 = new Thread(new Runnable() {                @Override                public void run() {                    try {                        System.out.println("t2线程进行初始化操作");                        Thread.sleep(3000);                        System.out.println("t2线程初始化完毕,通知t1线程继续。。。");                        countDown.countDown();                    } catch (Exception e) {                        e.printStackTrace();                    }                }            });         Thread t3 = new Thread(new Runnable() {                @Override                public void run() {                    try {                        System.out.println("t3线程进行初始化操作");                        Thread.sleep(4000);                        System.out.println("t3线程初始化完毕,通知t1线程继续。。。");                        countDown.countDown();                    } catch (Exception e) {                        e.printStackTrace();                    }                }            });        t1.start();        t2.start();        t3.start();    }}

执行结果如下

这里写图片描述

原创粉丝点击