Java线程池之主线程等待子线程完成

文章介绍了在Java开发中使用多线程提升效率时,如何确保主线程等待所有子线程完成后再输出结果。提供了两种方法:一是使用CountDownLatch计数器,每个子线程完成时计数器减一,当计数器为零时,主线程继续;二是利用Future接口的回调,通过循环检查所有Future对象是否已完成。这两种方法各有优缺点,适用于不同的场景。
摘要由CSDN通过智能技术生成

在开发中处理一些问题会使用多线程提升处理效率,但是又想有一个最终的结果输出来确认所有任务已经全部处理完成,此时就需要主线程等待所有子线程处理完成之后再输出结果。本次提供两种简单明了的Demo用于记录与分享。

  1. CountDownLatch 计数器方案

public void countDownLatchDemo() {
    int count = 10;
    CountDownLatch latch = new CountDownLatch(count);
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    for (int i = 0; i < count; i++) {
        int finalI = i;
        executorService.submit(() -> {
            try {
                System.out.println(finalI + "执行了, 子线程:" + Thread.currentThread().getName());
            } finally {
                latch.countDown();
            }
        });
    }
    try {
        latch.await();
    } catch (Exception e) {
        e.printStackTrace();
    }
    executorService.shutdown();
    System.out.println("线程池已关闭,主线程完成");
}

计数器方案需要处理前就清楚自己要处理的任务数,每个子线程处理完计数器都减少一次,直到计数器的值为零,主线程就不会被阻塞了,此时就可以进行最后的信息输出。

计数器方案当然也可以直接使用AtomicInteger 自减处理。

  1. Future 线程接口回调方案

public void futureDemo() {
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    List<Future> futureList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        int finalI = i;
        Future<?> submit = executorService.submit(() -> System.out.println(finalI + "执行了, 子线程:" + Thread.currentThread().getName()));
        futureList.add(submit);
    }
    try {
        while (true) {
            boolean out = false;
            for (Future future : futureList) {
                out = future.isDone();
                if (!out) break;
            }
            if (out) break;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    executorService.shutdown();
    System.out.println("线程池已关闭,主线程完成");
}

Future 的方案是通过循环的确认所有的Future对象是否已经全部结束,如果已经全部结束,主线程输出最终结果信息,此方案会有额外的消耗,如果增加时间间隔的话,在计时上会不是很准确。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值