首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【架构之路】java线程池执行过程

【架构之路】java线程池执行过程

作者头像
用户1750537
发布2025-08-29 14:17:22
发布2025-08-29 14:17:22
8100
代码可运行
举报
运行总次数:0
代码可运行
在这里插入图片描述
在这里插入图片描述

欢迎关注微信公众号:数据科学与艺术 作者WX:superhe199

在Java中确保主线程在五个子线程全部执行完成后退出,您可以使用ExecutorService提供的invokeAll()方法或CountDownLatch类来同步线程执行。这里分别给出两种实现方式:

方法一:使用ExecutorService.invokeAll() Java import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;

public class MainThreadExitAfterSubthreadsComplete {

代码语言:javascript
代码运行次数:0
运行
复制
public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(5);

    List<Callable<Void>> tasks = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        final int taskId = i;
        tasks.add(() -> {
            System.out.println("Task " + taskId + " started");
            // Replace with actual task logic
            simulateTaskExecution();
            System.out.println("Task " + taskId + " finished");
            return null;
        });
    }

    try {
        executor.invokeAll(tasks);
        System.out.println("All subthreads have completed.");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Main thread interrupted.");
    }

    executor.shutdown(); // Optionally, wait for graceful shutdown here
    System.out.println("Main thread exiting.");
}

private static void simulateTaskExecution() {
    try {
        Thread.sleep(1000); // Simulate task execution time
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

} 在这个示例中,我们创建了一个包含五个Callable任务的列表,并使用executor.invokeAll(tasks)一次性提交所有任务。invokeAll()方法会阻塞直到所有任务都完成。当所有子线程执行完毕后,主线程将继续执行后续代码并最终退出。

方法二:使用CountDownLatch Java import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;

public class MainThreadExitAfterSubthreadsComplete {

代码语言:javascript
代码运行次数:0
运行
复制
public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(5);
    CountDownLatch latch = new CountDownLatch(5);

    for (int i = 0; i < 5; i++) {
        final int taskId = i;
        executor.execute(() -> {
            System.out.println("Task " + taskId + " started");
            // Replace with actual task logic
            simulateTaskExecution();
            System.out.println("Task " + taskId + " finished");

            latch.countDown(); // Signal completion of this task
        });
    }

    try {
        latch.await(); // Block until all tasks complete
        System.out.println("All subthreads have completed.");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Main thread interrupted.");
    }

    executor.shutdown(); // Optionally, wait for graceful shutdown here
    System.out.println("Main thread exiting.");
}

private static void simulateTaskExecution() {
    try {
        Thread.sleep(1000); // Simulate task execution time
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

} 在这个示例中,我们使用CountDownLatch初始化为5(与子线程数量相同)。每个子线程在执行完毕后调用latch.countDown(),表示它已完成。主线程则调用latch.await(),该方法会阻塞直到计数器减至0,即所有子线程都已调用过countDown()。当所有子线程完成时,主线程继续执行后续代码并退出。

两种方法都可以确保主线程在五个子线程全部执行完成后退出。需要获取子任务的执行结果或处理可能抛出的异常,invokeAll()方法(配合Callable和Future)可能更为合适;如果仅需同步子线程的完成状态,CountDownLatch提供了一种简洁且高效的解决方案。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档