当前位置: 首页 > news >正文

Java 线程池如何知道一个线程的任务已经执行完成

1. 使用 Future 对象

ExecutorService executor = Executors.newFixedThreadPool(2);
Future<?> future = executor.submit(() -> {// 执行任务Thread.sleep(1000);
});// 检查任务是否完成
if (future.isDone()) {System.out.println("任务已完成");
}// 阻塞等待任务完成
try {future.get(); // 等待任务执行完毕
} catch (Exception e) {e.printStackTrace();
}

2. 使用 CompletableFuture

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 异步执行任务System.out.println("执行任务");
});// 添加完成回调
future.thenRun(() -> {System.out.println("任务已完成");
});// 等待完成
future.join();

3. 使用 CountDownLatch

CountDownLatch latch = new CountDownLatch(1);executor.execute(() -> {try {// 执行任务System.out.println("执行任务");} finally {latch.countDown(); // 任务完成后计数减一}
});// 等待任务完成
latch.await();

4. 使用 invokeAll 方法

List<Callable<String>> tasks = Arrays.asList(() -> "Task 1 result",() -> "Task 2 result"
);List<Future<String>> futures = executor.invokeAll(tasks);
// invokeAll会等待所有任务完成后再返回
for (Future<String> future : futures) {String result = future.get(); // 获取结果
}

5. 关闭线程池并等待

executor.shutdown();
try {// 等待所有任务在指定时间内完成if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {executor.shutdownNow(); // 强制关闭}
} catch (InterruptedException e) {executor.shutdownNow();
}

线程池通过以下几种机制来知道线程任务已经执行完成:

6. 任务执行状态跟踪

线程池内部维护每个任务的执行状态:

  • 当任务提交到线程池时,会创建对应的 Future 对象
  • Future 对象跟踪任务的执行状态(未开始、运行中、已完成、已取消等)

7. Worker线程生命周期管理

// 线程池内部的Worker机制
class Worker implements Runnable {public void run() {while (task != null || (task = getTask()) != null) {// 执行任务task.run();// 任务执行完成后,继续获取下一个任务}// worker线程结束时,线程池会感知到}
}

8. 主要的检测方式

Future状态检查

  • 通过 Future.isDone() 检查任务是否完成
  • 通过 Future.get() 阻塞等待任务完成

线程池状态监控

  • ThreadPoolExecutor.getCompletedTaskCount() 获取已完成任务数
  • ThreadPoolExecutor.getActiveCount() 获取活跃线程数

回调机制

  • 使用 CompletableFuturethenRun()thenAccept() 等方法注册完成回调

9. 任务完成通知

RunnableCallable 任务的 run()call() 方法执行完毕后:

  • 线程池会自动更新任务状态为完成
  • 如果有等待的线程(如调用 Future.get()),会收到通知并继续执行
  • 线程会返回线程池的阻塞队列中等待下一个任务

这种方式让线程池能够精确地跟踪每个任务的执行状态,确保资源的合理管理和任务的正确执行。

http://www.dtcms.com/a/473373.html

相关文章:

  • JVM字节码与类的加载(一):类的加载过程详解
  • 强军网网站建设网站需要备案才能建设吗
  • 耄大厨——AI厨师智能体(3-工具调用)
  • (二)黑马React(导航/账单项目)
  • SA-LSTM
  • 【Java并发】深入理解synchronized
  • Docker 安装 Harbor 教程
  • Python+Flask+Prophet 汽车之家二手车系统 逻辑回归 二手车推荐系统 机器学习(逻辑回归+Echarts 源码+文档)✅
  • AI_NovelGenerator:自动化长篇小说AI生成工具
  • 济南网站制作开通免费个人简历模板官网
  • 全链路智能运维中的异常检测与根因定位技术
  • 解构 CodexField:创作者经济到模型金融化的代币逻辑与潜力
  • SpringBoot 实现自动数据变更追踪
  • C语言⽂件操作讲解(3)
  • 对网站做数据分析北京市建设工程信息
  • 1.6虚拟机
  • XCP服务
  • Excel - Excel 列出一列中所有不重复数据
  • 如何获取用户右击的Excel单元格位置
  • 昆明企业网站建设公司虹口建设机械网站制作
  • 宁波p2p网站建设黑龙江省建设安全网站
  • Spring Boot 3零基础教程,自动配置机制,笔记07
  • Spring通关笔记:从“Hello Bean”到循环依赖的奇幻漂流
  • 【Spring Security】Spring Security 密码编辑器
  • MCU ADC外设工作原理介绍
  • k8s的ymal文件
  • 杭州公司建设网站网站建设标签
  • 博客系统小笔记
  • 后端开发和软件开发有什么区别
  • 分布式专题——41 RocketMQ集群高级特性