Java并发之CountDwonLatch

原文地址:https://blog.csdn.net/tongdanping/article/details/79589253

CountDwonLatch(闭锁)

CountDwonLatch用来等待一个或者多个线程完成操作,作用类似于当前线程里调用join()方法,让当前线程等待join()进来的线程执行完毕再执行当前线程剩下的逻辑,但是CountDownLatch比join()的功能更加强大,使用方法如下:

public class CountDownLatchTest {
    //新建一个CountDwonLatch对象并传入计数器的值 2
    static CountDownLatch cdl = new CountDownLatch(2);   
    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    System.out.println("thread 1: 1 ");
                    Thread.sleep(1000);
                    System.out.println("thread 1 : 2");
                  //在被等待的线程或者步骤执行完毕后调用countDwon()方法让计数器减1
                    cdl.countDown();                   
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                }

            }
        }).start();
        new Thread(new Runnable(){
            @Override
            public void run(){
                try{
                    System.out.println("thread 2 : 1");
                    Thread.sleep(1000);
                    System.out.println("thread 2 : 2");
                  //在被等待的线程或者步骤执行完毕后调用countDwon()方法让计数器减1
                    cdl.countDown();
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                }


            }        }).start();
        //在等待的主线程中调用await()方法等待其他线程,直到计数器为0 再执行主线程接下来的逻辑
        cdl.await();                                
        System.out.println("thread : main");

    }
}

无论怎么执行,thread : main 总是最后输出
输出结果:
Java并发之CountDwonLatch_第1张图片

CountDwonLatch的使用方法:

在CountDwonLatch中,countDwon()方法和await()方法搭配使用才能起到类似join()的作用:
(1)首先创建一个CountDwonLatch对象并传入要等待的线程的数量,这是个计数器;

(2)在被等待的线程或者步骤执行完毕后调用countDwon()方法让计数器减1,countDwon()方法是一个等待的计数器,每次调用countDwon()方法,计数器减1,直到计数器为0,countDwon可以用在任何地方,可以是一个步骤的一个点,也可以是一个线程。

(3)在等待其他线程的主线程中,调用await()方法来等待其他调用了countDwon()的线程,直到计数器为0,再执行该线程接下来的逻辑,当然,如果某个线程执行的时间过久,当前线程不可能一直等待,那么可以调用await(long time, TimeUnit unit)方法。

使用场景:
一个线程等到其它几个线程执行完才能执行的场景;

你可能感兴趣的:(Java并发)