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

java异步判断线程池所有任务是否执行完

在Java中,使用线程池(ExecutorService)可以高效地管理和执行异步任务。对于某些应用场景,可能需要异步地判断线程池中所有任务是否执行完毕。以下是一个高度专业的指南,讲解如何在Java中实现这一功能。

步骤概述

  1. 创建并配置线程池。
  2. 提交多个异步任务到线程池。
  3. 使用 CompletionService来监控任务的完成情况。
  4. 实现异步检查所有任务是否完成。

1. 创建并配置线程池

使用 Executors类创建一个合适的线程池。以下示例使用固定大小的线程池。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;ExecutorService executorService = Executors.newFixedThreadPool(10);
​

2. 提交异步任务

将多个异步任务提交到线程池。这里使用简单的示例任务进行演示。

import java.util.concurrent.Callable;for (int i = 0; i < 20; i++) {final int taskId = i;executorService.submit(new Callable<Void>() {@Overridepublic Void call() throws Exception {System.out.println("Executing task " + taskId);Thread.sleep(1000);  // 模拟任务执行时间System.out.println("Task " + taskId + " completed");return null;}});
}
​

3. 使用 CompletionService监控任务完成情况

CompletionService可以将任务的提交与完成分离,使我们能够方便地监控任务的完成情况。

import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;CompletionService<Void> completionService = new ExecutorCompletionService<>(executorService);
​

4. 实现异步检查任务完成

可以使用一个单独的线程来异步检查所有任务是否完成。当所有任务完成后,执行相应的操作。

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;Runnable checkCompletion = new Runnable() {@Overridepublic void run() {int completedTaskCount = 0;while (completedTaskCount < 20) {try {Future<Void> future = completionService.take(); // 阻塞等待下一个任务完成future.get(); // 获取任务结果,确保任务没有抛出异常completedTaskCount++;System.out.println("Completed tasks: " + completedTaskCount);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}System.out.println("All tasks completed.");}
};new Thread(checkCompletion).start();
​

完整代码示例

import java.util.concurrent.*;public class ThreadPoolCompletionChecker {public static void main(String[] args) {// 创建线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 创建CompletionServiceCompletionService<Void> completionService = new ExecutorCompletionService<>(executorService);// 提交任务for (int i = 0; i < 20; i++) {final int taskId = i;completionService.submit(new Callable<Void>() {@Overridepublic Void call() throws Exception {System.out.println("Executing task " + taskId);Thread.sleep(1000);  // 模拟任务执行时间System.out.println("Task " + taskId + " completed");return null;}});}// 异步检查所有任务是否完成Runnable checkCompletion = new Runnable() {@Overridepublic void run() {int completedTaskCount = 0;while (completedTaskCount < 20) {try {Future<Void> future = completionService.take(); // 阻塞等待下一个任务完成future.get(); // 获取任务结果,确保任务没有抛出异常completedTaskCount++;System.out.println("Completed tasks: " + completedTaskCount);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}System.out.println("All tasks completed.");executorService.shutdown(); // 关闭线程池}};new Thread(checkCompletion).start();}
}
​

分析说明表

步骤描述
创建并配置线程池使用 Executors.newFixedThreadPool创建一个固定大小的线程池。
提交异步任务使用 submit方法将多个 Callable任务提交到线程池。
使用 CompletionService创建 ExecutorCompletionService实例来监控任务的完成情况。
异步检查任务完成使用一个单独的线程异步检查任务的完成情况,通过 CompletionService.take()阻塞等待任务完成,使用 Future.get()确保任务没有抛出异常。

思维导图

Java异步判断线程池任务完成
|
|-- 创建并配置线程池
|   |-- Executors.newFixedThreadPool
|
|-- 提交异步任务
|   |-- submit(Callable)
|
|-- 使用CompletionService
|   |-- ExecutorCompletionService
|
|-- 异步检查任务完成
|   |-- 新建线程
|   |-- CompletionService.take()
|   |-- Future.get()
http://www.lryc.cn/news/516373.html

相关文章:

  • 25.1.3 UART串口通信
  • 如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构
  • 防止密码爆破debian系统
  • 高阶知识库搭建实战六、(向量数据库Faiss安装)(练习推荐)
  • 微信小程序获取图片使用session(上篇)
  • 代码随想录算法训练营第七十天 | 拓扑排序精讲,Dijkstra(朴素版)精讲,Dijkstra(堆优化版)精讲
  • 【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)
  • Excel 打印时-预览界面内容显示不全
  • nginx-限流(请求/并发量)
  • Vue——使用html2pdf插件,下载pdf文档到本地
  • 每日一题:BM1 反转链表
  • CSS 实现字体颜色渐变
  • 【软考网工笔记】计算机基础理论与安全——网络安全
  • JS数组转字符串(3种方法)
  • 云计算安全需求分析与安全防护工程
  • C/C++的printf会调用malloc()
  • spring mvc源码学习笔记之五
  • 3272 小蓝的漆房
  • MySQL使用触发器进行备份
  • 数据结构与算法-顺序表
  • OpenAI CEO 奥特曼发长文《反思》
  • Shell编程详解
  • 跨站脚本攻击(XSS)详解
  • 03-QT中的QMainWindow+对话框QDialog
  • c# 中Parallel.ForEach 对其中一个变量进行赋值 引发报错
  • ElasticSearch备考 -- 整体脉络梳理
  • vue Element Ui Upload 上传 点击一个按钮,选择多个文件后直接上传,使用防抖解决多次上传的问题。
  • 【HF设计模式】05-单例模式
  • 运维人员的Python详细学习路线
  • 软件体系结构与设计模式