合理的在线程池中使用CountDownLatch锁

本文介绍了如何在Java中利用线程池和CountDownLatch实现多线程操作,并确保主线程等待所有子线程执行完毕后再继续。通过创建一个CountDownLatch实例,设置其初始计数为线程数量,每个子线程完成后调用countDown(),主线程通过await()方法阻塞等待计数器归零,从而达到同步效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:使用线程池来进行多线程操作的话,怎么实现让主线程等待其他线程的任务执行完后再进行接下来的操作。

解决方案:线程池+CountDownLatch

demo:

public void testLock(){
        //模拟并发
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        ids.add(4);
        ids.add(5);
        ids.add(6);
        ids.add(7);
        ids.add(8);
        //使用锁,用于等待结果全部执行完
        CountDownLatch countDownLatch = new CountDownLatch(ids.size());
        ExecutorService executor = Executors.newFixedThreadPool(50);
        executor.execute(() -> {
            //多线程处理业务
            try {
                // 模拟业务
                Thread.sleep(1000);
            } catch (Exception e) {

            } finally {
                //放在finally保证不管结果是否异常都会减,避免锁死
                countDownLatch.countDown();
            }
        });
        try {
            //主线程阻塞等待锁
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

CountDownLatch原理:

CountDownLatch 是通过一个计数器来实现的,当我们在 new 一个 CountDownLatch 对象的时候,需要带入该计数器值,该值就表示了线程的数量。

每当一个线程完成自己的任务后,计数器的值就会减 1 。当计数器的值变为0时,就表示所有的线程均已经完成了任务,然后就可以恢复等待的线程继续执行了。
由于调用了 countDown方法,所以在当前计数到达0之前,await方法会一直受阻塞;当计数到达0时会唤醒await方法阻塞的线程执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值