多线程——CountDownLatch的使用

CountDownLatch是一个同步工具类,它允许一个或者多个线程一直等待,直到其他线程执行完毕再执行。
CountDownLatch的方法:
在这里插入图片描述
CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完 成,这里就传入N。

 CountDownLatch latch=new CountDownLatch(2);

代码示例:

 for(int i=0;i<5;i++){
           final int k=i;
           new Thread(new Runnable() {
               @Override
               public void run() {
                   System.out.println(k);
               }
           }).start();
       }
        System.out.println("所有线程都执行完毕");
    }

这段代码的的预期效果是在所有线程完成输出之后,由主线程输出“所有线程都执行完毕”。
输出结果:

0
2
1
所有线程都执行完毕
3
4

Process finished with exit code 0

这是由于线程的执行是由CPU决定的,所以线程的执行也是一个随机的过程,所以并不能达到我们想要的预期效果。
现在用上CountDownLatch

 CountDownLatch latch=new CountDownLatch(5);
       for(int i=0;i<5;i++){
        final int k=i;
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(k);
                //计数器减1
                latch.countDown();
            }
        }).start();
    }
       //在上面所有线程执行完之前阻塞
       latch.await();
        System.out.println("所有线程都执行完毕");

运行结果:

0
3
2
1
4
所有线程都执行完毕

Process finished with exit code 0

这样就符合我们的预期值

当我们调用CountDownLatch的countDown方法时,计数器n就会减1,CountDownLatch的await方法 会阻塞当前线程,直到n变成零。由于countDown方法可以用在任何地方,所以这里说的N个 点,可以是n个线程,也可以是1个线程里的n个执行步骤。用在多个线程时,只需要把这个 CountDownLatch的引用传递到线程里即可。 如果有某个解析sheet的线程处理得比较慢,我们不可能让主线程一直等待,所以可以使 用另外一个带指定时间的await方法——await(long time,TimeUnit unit),这个方法等待特定时 间后,就会不再阻塞当前线程。join也有类似的方法。
特别注意:
计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会 阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数 器的值。一个线程调用countDown方法happen-before,另外一个线程调用await方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值