hololive滚滚山免安装绿色中文版
995M · 2025-10-31
在 Java 并发编程中,线程池是提高系统吞吐量和响应速度的重要工具。
而是在高并发场景下,动态线程池(程序运行期间动态调整线程池参数而无需重启程序的技术)被广泛应用。然而,如何确保动态线程池中的所有任务都执行完毕,是一个常见的面试问题,也是实际开发中必须解决的关键问题。
所以,本文将深入探讨几种常见的方法,帮助开发者在实际项目中优雅地处理这个问题。
使用 CountDownLatch 来跟踪任务的完成情况,实现代码如下:
// 动态线程池
@Autowired
@Qualifier("dtpExecutor1")
private DtpExecutor dtpExecutor;
@RequestMapping("isDone")
public String isDone() throws InterruptedException {
    // 申请计数器
    CountDownLatch latch = new CountDownLatch(10);
    for (int i = 0; i < 10; i++) {
        dtpExecutor.submit(() -> {
            try {
                Thread.sleep(1000);
                System.out.println("Task executed by " + Thread.currentThread().getName());
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                latch.countDown(); // 任务完成,计数器减1
            }
        });
    }
    // 等待所有任务完成
    latch.await();
    return "ok";
}
注意:CountDownLatch 是一次性的,不能重复使用;如果需要重复使用,可以考虑 CyclicBarrier。
从 Java 8 开始,CompletableFuture 提供了更强大的异步编程能力。它不仅支持 Future 的功能,还支持任务编排、组合、异常处理等高级特性。使用 CompletableFuture,可以更方便地管理多个异步任务的执行,并确保所有任务都完成。
我们可以借助 CompletableFuture 提供了 allOf() 方法,可以等待所有任务完成,具体实现代码如下:
// 动态线程池
@Autowired
@Qualifier("dtpExecutor1")
private DtpExecutor dtpExecutor;
@RequestMapping("isDone")
public String isDone() {
    // 1.任务一
    CompletableFuture future = CompletableFuture.runAsync(() -> {
        // 执行业务逻辑
    }, dtpExecutor);
    // 2.任务二
    CompletableFuture future2 = CompletableFuture.runAsync(() -> {
        // 执行业务逻辑
    }, dtpExecutor);
    // 等待所有任务完成
    CompletableFuture<Void> allTask = CompletableFuture.allOf(future, future2);
    // 阻塞直到全部完成(无需结果)
    allTask.join();
    return "ok";
}
确保动态线程池中的所有任务都执行完毕,本文介绍了两种常见的方法:
最后:面试官问这个问题,避免回答过于八股化和 AI 化。因此,在回答时,可以结合自己的具体项目模块实现来回答,要用自己的语言(非标准答案)表达出来。
 
                     
                            995M · 2025-10-31
 
                            90.9M · 2025-10-31
 
                            478M · 2025-10-31
