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

news/2025/1/7 17:45:55/文章来源:https://www.cnblogs.com/zzggqq/p/18655024

在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.hqwc.cn/news/864900.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# AIModelRouter:使用不同的AI模型完成不同的任务

https://www.cnblogs.com/mingupupu/p/18654982 AIModelRouter AI模型路由,模型的能力有大小之分,有些简单任务,能力小一点的模型也能很好地完成,而有些比较难的或者希望模型做得更好的,则可以选择能力强的模型。为什么要这样做呢?可以降低AI模型的使用成本,毕竟能力强的…

使用Windows批处理命令批量上传jar到Nexus(maven私服)中

这里就不介绍nexus的搭建了;网上很多都是.sh脚本,linux比较合适,当然用git也可以运行;但是.bat文件肯定是所有windows系统都是可以执行的;所以这里介绍一下用windows的批处理命令来编写; 首先,你得先确定的仓库状态是处于Allow redeploy状态;新建一个文件mavenimport.b…

第七届封神台CTF

没事,学习了一下第七届封神台CTF Web welcome_to_zkaqctf ​​ 源码: const {promises: fs} = require(fs); const fastify = require(fastify);const flag = process.env.FLAG || zkaq{do_you_believe_this_is_flag?};const app = fastify(); app.get(/, async (_, res) =&…

Activiti 手工新增历史环节20250116

手工新增(历史任务表)act_hi_taskinst,其实这个表记录加一条就可以 注:字段2值为空,字段值10为空,字段11、12 值都要加-----act_hi_taskinst.PROC_DEF_ID myProcess:34:400000000000736-----act_hi_taskinst.PROC_INST_ID_ 400000000000496SELECT * FROM "act_hi_…

SQL语言做加减运算时将某项的null值转换为0

在SQL语言中,很多时候,在表项中会遇到null值,null值有三大特点:1)NULL值不参加统计;2)NULL值不进入计算表达式;3)不能与其它值进行比较。 因此,在运算中要将null值有时候转换成其他值,这里提供一种加减运算中转换为0的方法。 如:在算工资的时候,总工资=基础工资+奖…

中电金信携手华为发布“全链路实时营销解决方案”,重塑金融营销数智新生态

在数智化转型成为驱动经济社会高质量发展的新引擎背景下,“数智方案”栏目聚焦金融等国计民生重点行业场景,依托中电金信“源启筑基+咨询引领+应用重构”的产品及服务体系,输出市场洞察和行业解决方案、应用案例,旨在全面推动行业IT架构升级、数智化转型。数智驱动是金融机…

实时协作:如何通过协作文档提升团队生产力

在当今快节奏的工作环境中,团队协作的效率直接决定了项目的成败。然而,文档管理作为协作的核心环节,却常常成为效率的“隐形杀手”。无论是版本混乱、信息丢失,还是沟通不畅,这些问题都在无形中消耗着团队的时间和精力。而协作文档工具的出现,正是为了解决这些痛点,彻底…

win10重装如何跳过微软账号直接设置本地帐户.221111

​在添加你的帐户界面,选择脱机帐户2. 第二个页面,选择有限的体验3. 第三个页面,设置自己本地的用户名4. 第四个页面,设置自己本地的密码.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; paddin…

看板软件在利益相关者期望管理中的应用与探索

制定一个有效的利益相关者期望管理计划需要全面识别利益相关者、深入分析他们的期望、制定期望管理策略、制定详细的期望管理计划、实施与调整期望管理计划以及建立绩效评估机制。通过这些步骤,你可以确保项目目标与利益相关者的期望保持一致,提高项目的成功率和满意度。制定…

centos7安装docker.240103

​1. installDocker.sh ,然后自行安装 安装所需资源包 sudo yum install -y yum-utils 设置docker下载地址 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo安装docker sudo yum install docker-ce -y docker-ce-cli conta…

MySQL8设置root用户远程访问.240103

查询当前root状态,默认root的host是localhost use mysql; select user,host from user;update root的host为% update user set host = % where user =root;检查客户端windows 的防火墙,关闭防火墙try。.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimg…

云计算真的很便宜吗?.240103

​37Signals的首席技术官David Heinemeier Hansson表示,2022年一共在AWS(亚马逊云)花了3,201,564美元,即每月266,797美元。其中759,983美元都花费在AWS的EC2和EKS服务服务计算上面。 Heinemeier指出,即使是这个账单,也是团队共同努力保持cost down的结果。“这已经是一个…