美文网首页Java
CountDownLatch相关

CountDownLatch相关

作者: 今晚打老虎_d166 | 来源:发表于2020-05-03 16:24 被阅读0次

    1: 为什么需要countDownLatch

    1.1 CountDownLatch同步计数器,当计数器数值减为0时,所有受其影响而等待的线程将会被激活,这样保证模拟并发请求的真实性。
    1.2 面试的时候会被问到

    2: 概念

    CountDownLatch位于package java.util.concurrent 包下,是一个用来协调线程同步的通信类,CountDownLatch内部通过一个计数器,能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。

    3:源代码

    //  每次将count减1
    public void countDown() { sync.releaseShared(1);}
    
    // 让调用该方法的线程挂起,直到count被减到0
    public void await()throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
    }
    

    4:示例

    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class CountDownLatchTest {
    
        public static void main(String[] args) {
            final CountDownLatch latch = new CountDownLatch(3);
            System.out.println("主线程开始执行…… ……");
            //第一个子线程执行
            ExecutorService pool = Executors.newFixedThreadPool(3);
            for(int i=0;i<3;i++){
                Runnable runnable = new Runnable() {
                    public void run() {
                        try{
                            System.out.println("线程名称:"+Thread.currentThread().getName()+"执行开始");
                            Thread.sleep(1000);
                            System.out.println("线程名称:"+Thread.currentThread().getName()+"执行结束");
                            latch.countDown(); // 每个线程执行减1
                        } catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                };
                pool.execute(runnable); // 线程执行
            }
    
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("子线程都执行完成,继续执行主线程");
        }
    }
    

    输出:

    主线程开始执行…… ……
    线程名称pool-1-thread-1执行开始
    线程名称pool-1-thread-3执行开始
    线程名称pool-1-thread-2执行开始
    线程名称pool-1-thread-3执行结束
    线程名称pool-1-thread-1执行结束
    线程名称pool-1-thread-2执行结束
    子线程都执行完成,继续执行主线程
    

    相关文章

      网友评论

        本文标题:CountDownLatch相关

        本文链接:https://www.haomeiwen.com/subject/yvodghtx.html