多线程工具类CountDownLatch使用

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

1、CountDownLatch使用场景

CountDownLatch是一个多线程工具类,里面的主要方法就是await和countdown

使用场景:
有五个业务线程

业务线程1,业务线程2,业务线程3、业务线程4
业务线程1和业务线程2执行到某一步之后进行等待,需要业务线程3和业务线程4里面的分别其中一个任务执行完之后,业务线程1,和业务线程2再继续执行

2、CountDownLatch的原理

CountDownLatch的原理其实,内部有一个计数器,比如业务线程1,和业务线程2需要等待3个任务执行完毕,则可以实例化一个CountDownLatch,它的初始值为3,然后业务线程1,和业务线程2,执行完分别的某一步之后分别调用CountDownLatch的await方法,业务线程1和业务线程2就会进入等待状态,业务线程3 执行完任务1之后执行CountDownLatch的countdown方法,CountDownLatch的初始值就会从3变成2,然后继续执行任务2,执行完成之后继续执行countdown方法,然后业务线程四执行完成任务3,CountDownLatch就会变成0,就会通知业务线程1和业务线程2继续执行剩下的操作。

上边说的例子有可能业务线程4先执行完,都不一定,但是他们的countdown的次数一定是3,最终CountDownLatch的初始值还是会变成0

CountDownLatch的初始值其实是线程安全的,其内部的实现原理用到了AQS,这个咱们还没学到,AQS保证了CountDownLatch的Count的安全,也就能实现标题1的业务场景

CountDownLatch的使用不一定非得一个线程进行等待,多个线程等待也是可以的,他的Count数和线程数也是没有关系的,Count的数 和执行countDown的次数是有关系的,一个线程可以多次执行countDown方法的

image.png

3、CountDownLatch使用

public class UseCountDownLatch {
	
    static CountDownLatch latch = new CountDownLatch(6);

    /*初始化线程*/
    private static class InitThread implements Runnable{

        public void run() {
        	System.out.println("Thread_"+Thread.currentThread().getId()
        			+" ready init work......");
            latch.countDown();
            for(int i =0;i<2;i++) {
            	System.out.println("Thread_"+Thread.currentThread().getId()
            			+" ........continue do its work");
            }
        }
    }

    /*业务线程等待latch的计数器为0完成*/
    private static class BusiThread implements Runnable{

        public void run() {
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for(int i =0;i<3;i++) {
            	System.out.println("BusiThread_"+Thread.currentThread().getId()
            			+" do business-----");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            public void run() {
            	SleepTools.ms(1);
                System.out.println("Thread_"+Thread.currentThread().getId()
            			+" ready init work step 1st......");
                latch.countDown();
                System.out.println("begin step 2nd.......");
                SleepTools.ms(1);
                System.out.println("Thread_"+Thread.currentThread().getId()
            			+" ready init work step 2nd......");
                latch.countDown();
            }
        }).start();
        new Thread(new BusiThread()).start();
        for(int i=0;i<=3;i++){
            Thread thread = new Thread(new InitThread());
            thread.start();
        }

        latch.await();
        System.out.println("Main do ites work........");
    }
}
复制代码

CountDownLatch的使用还是很简单的哈哈哈

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享