java的异步任务优化

如何优雅的统计代码耗时 一、前言 代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。 可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。 在开始正文前,先说下前提,“代码耗时统计”的并不是某个方法的耗时,而是任意代码段之间的耗时。这个代码段,可能是 阅读详情

源于实际项目中出现任务执行超时或者出现部分任务异常导致整个业务功能失败(兼容java8版本)

先看代码

package tool;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.function.Supplier;

public class CompletableFutureAllOfDemo {
    // 全局定时线程池(用于单个任务超时控制,复用避免频繁创建)
    private static final ScheduledExecutorService TIMEOUT_SCHEDULER = Executors.newScheduledThreadPool(3);
    // 业务线程池(执行异步任务,建议替换为项目自定义线程池)
    private static final ExecutorService BUSINESS_EXECUTOR = Executors.newFixedThreadPool(5);

    /**
     * 封装单个异步任务:含10秒超时 + 全局异常处理
     * @param task 业务任务(Supplier类型,无入参有返回值)
     * @param taskName 任务名称(用于异常/超时提示)
     * @param timeoutDefault 超时默认返回值
     * @param exceptionDefault 异常默认返回值
     * @return 封装后的CompletableFuture
     */
    private static <T> CompletableFuture<T> wrapTask(
            Supplier<T> task,
            String taskName,
            T timeoutDefault,
            T exceptionDefault
    ) {
        // 1. 提交业务异步任务
        CompletableFuture<T> future = CompletableFuture.supplyAsync(task, BUSINESS_EXECUTOR);

        // 2. JDK8实现10秒超时:超时后强制设置默认值
        TIMEOUT_SCHEDULER.schedule(() -> {
            boolean isTimeout = future.complete(timeoutDefault);
            if (isTimeout) {
                System.err.println("任务[" + taskName + "]超时(10秒),返回默认值");
            }
        }, 10, TimeUnit.SECONDS);

        // 3. 全局异常处理:捕获任务执行/回调链所有异常
        return future.handle((result, ex) -> {
            if (ex != null) {
                System.err.println("任务[" + taskName + "]执行异常:" + ex.getMessage());
                return exceptionDefault;
            }
            return result; // 正常结果/超时默认值
        });
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // ========== 步骤1:定义多个业务任务 ==========
        // 任务1:正常执行(模拟耗时5秒)
        Supplier<String> task1 = () -> {
            try { Thread.sleep(5000); } catch (InterruptedException e) {}
            return "任务1正常结果";
        };

        // 任务2:模拟执行异常
        Supplier<String> task2 = () -> {
            throw new RuntimeException("数据库查询失败");
        };

        // 任务3:模拟超时(耗时15秒,超过10秒超时阈值)
        Supplier<String> task3 = () -> {
            try { Thread.sleep(15000); } catch (InterruptedException e) {}
            return "任务3正常结果";
        };

        // ========== 步骤2:封装每个任务(超时+异常处理) ==========
        CompletableFuture<String> future1 = wrapTask(task1, "任务1", "任务1超时默认值", "任务1异常默认值");
        CompletableFuture<String> future2 = wrapTask(task2, "任务2", "任务2超时默认值", "任务2异常默认值");
        CompletableFuture<String> future3 = wrapTask(task3, "任务3", "任务3超时默认值", "任务3异常默认值");

        // ========== 步骤3:使用allOf等待所有任务完成 ==========
        CompletableFuture<Void> allFuture = CompletableFuture.allOf(future1, future2, future3);
        // 阻塞等待所有任务(无论成功/失败/超时)执行完毕
        allFuture.get();

        // ========== 步骤4:收集所有任务的最终结果 ==========
        List<String> results = new ArrayList<>();
        results.add(future1.get()); // 任务1:正常结果
        results.add(future2.get()); // 任务2:异常默认值
        results.add(future3.get()); // 任务3:超时默认值

        // 打印最终结果
        System.out.println("所有任务结果:");
        for (String result : results) {
            System.out.println("- " + result);
        }

        // ========== 步骤5:关闭线程池(项目关闭时执行) ==========
        TIMEOUT_SCHEDULER.shutdown();
        BUSINESS_EXECUTOR.shutdown();
    }
}

输出结果:

优化点说明:

1.由于之前异步任务写得比较简陋,这里做了一个方法提取,增加了10秒超时和全局异常捕获

2.不再在无返回结果的任务中用Map收集结果,而是在结束之后统一收集结果,每一个异步任务结果返回

3.之前用runAsyn改成supplyAsyn

4.不用Executors的方式创建线程池,而用ThreadPoolTaskExecutor方式创建

5.两个线程池隔离分开(全局调度线程池和业务执行线程池),而非共用一个线程池,且用@Autowaired注入类中,通过方法参数传递进去,注意ThreadPoolTaskExecutor 是 Spring 框架(spring-context 模块)提供的线程池实现

隔离的好处:1.资源抢占风险隔离2.故障域隔离3.监控和调优更精准

在 Spring/Spring Boot 项目中,推荐使用 ThreadPoolTaskExecutor(而非原生 ThreadPoolExecutor),因为它更贴合 Spring 生态,支持 Spring 的生命周期管理、线程池监控、优雅关闭等特性。

异步任务

异步任务,默认使用ForkJoinPool.commonPool(),也可指定自定义线程池。

  • 无返回值:CompletableFuture.runAsync(Runnable)
  • 有返回值:CompletableFuture.supplyAsync(Supplier)
YOLO26涨点改进 | 独家创新,细节涨点改进篇 | CVPR 2025顶会 | YOLO26引入Mona即插即用模块, 含MoCAA和DyTMona二次创新改进,含多种创新改进高效发论文 本文给大家介绍Mona即插即用模块, 含MoCAA和DyTMona二次创新模块优化YOLO26模型。YOLO26引入 Mona通过引入多尺度视觉友好型卷积滤波器(如3x3、5x5、7x7深度卷积)和可伸缩归一化层来优化适配器设计,以更好地处理视觉信号并调节输入特征分布。YOLO26引入Mona即插即用模块, 含MoCAA和DyTMona二次创新改进,含多种创新改进高效发论文。适合目标检测、图像分割、图像分类等所有CV任务通用即插即用模块。 阅读详情

相关推荐

Blender骨骼绑定实战:如何用IK控制器让角色动作更自然(附常见问题解决)

本文深入探讨了Blender中IK控制器的实战应用,旨在解决角色动作僵硬问题。通过对比IK与FK的核心差异,详细解析了IK链的构建、参数设置及极向目标的使用,并提供了控制器定制、IK/FK无缝切换等高级技巧,帮助动画师实现更自然、符合直觉的角色动画。

weixin_29243279的博客 439

CompletableFuture

方法签名: 或 使用场景:需要“算出一个结果”的任务(查库、HTTP、计算等) (无返回值) 方法签名: 或 使用场景:只做副作用(写日志、发 MQ),不需要结果示例 1.3 线程池选择 1.3.1 不指定线程池(默认使用 默认使用 。适用场景:短小的 CPU 计算(执行快、不会阻塞线程)。风险:如果把阻塞型 IO(HTTP/DB/文件)丢进默认池,容易把公共池线程占满,拖慢所有同池任务。当你调用: 它的源码里其实是: 也就是说:默认线程池 = 这是一个全局共

m0_73837751的博客 858

numeca linux 11,NUMECA FINE/Turbo16下载-NUMECA FINE/Turbo16官方版v16.0 最新版 - 起点软件园...

NUMECA FINE/Turbo16,空气动力学模拟工具,帮助小伙伴随时仿真模拟,让小伙伴可以模拟出最真实的环境,让小伙伴可以轻松完成环境模拟的服务,帮助小伙伴更好的解决自己的课题研究!NUMECA FINE/Turbo16说明1、支持在64位WINDOWS操作系统和LINUX操作系统下运行2、基于全二阶精度的数值格式,保证了计算精度3、采用先进的全多重网格技术和基于密度的求解方法保证了快速的流...

weixin_39858298的博客 1624

如何优化Java异步任务的性能?

优化Java异步任务的性能需要从线程管理、任务设计、资源利用等多个维度综合考虑。

2509_93306611的博客 317

从“看不懂Sansen”到亲手搭建:一个Class AB输出级+浮动电压源的保姆级设计复盘

本文详细记录了从理论困惑到实践突破的Class AB输出级与浮动电压源设计全过程。通过电流镜调试、恒定跨导优化及版图匹配等关键步骤,作者实现了高性能运放设计,并分享了从仿真到实测的宝贵经验,为模拟电路初学者提供实用指导。

weixin_33737774的博客 869

IEC61850规约客户端软件开发实战(第二章)

本文介绍了基于IEC61850规约的客户端软件开发过程,重点阐述功能界面设计和服务端连接功能的实现。界面采用Qt框架设计,包含功能按钮区、数据模型展示区(使用QTreeWidget)和状态显示区。连接功能通过libiec61850开源库实现,详细说明了连接流程、句柄创建及状态管理的代码实现。测试结果表明系统能正确识别连接状态,并通过界面直观显示。文章为IEC61850规约软件开发提供了实用参考,下期将分享规约模型数据加载的实现过程。

半青年的博客 2859

queueing 优化_Java异步任务优化CompletionService

原标题:Java异步任务优化CompletionService上一篇详细介绍了Future与Callable,而CompletionService则对它们的优化。Future的缺陷Future通过get方法来获取异步任务的结果,如果任务还没有完成则阻塞线程,因为我们需要它的结果,所以等待是应该的。如果需要处理一批这类任务,提交到线程池我们最终会得到多个Future,但是每个任务执行的时间可能并不相...

weixin_39662263的博客 70

Cloud Connector RFC 访问控制深度实践:为 SAP BTP ABAP environment 打通安全、可控的远程连接

本文是一份面向企业ABAP团队与平台工程团队的Cloud Connector RFC访问控制配置指南。文章详细介绍了虚拟主机/实例号、负载均衡、资源白名单等核心概念,并提供了从零开始的配置流程。主要内容包括:通过Cloud Connector建立安全隧道的价值(零暴露、最小权限)、两种连接类型(无负载均衡/带负载均衡)的配置方法、资源白名单设置技巧,以及两个典型应用场景(Custom Code Migration远程检查与BAPI调用)的实操案例。指南基于SAP官方文档,包含落地经验与避坑建议,可帮助团队快

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 146

高并发Java架构设计中的线程池与异步任务优化

通过合理配置线程池和优化异步任务,Java应用可以在高并发场景下实现良好的性能和响应速度。了解线程池的工作原理和配置方式是每个Java架构师的必备技能。只有通过不断的监控与调整,才能保证系统的高可用性和稳定性。本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

微赚淘客系统开发者博客 1107

AEJoy —— 最受欢迎的 5 个 Ae 表达方式

NOTE] 原文作者我意识到表达式可能令人生畏,有些人宁愿复制粘贴有用的代码,而不愿学习这门语言。对此我完全理解。因此,我想与您分享我的。这些是我几乎在每个项目中都会使用的表达式,我认为它们极大地提升了工作流程。

ShaderJoy 的兴趣技术杂货铺 364

【教程4>第4章>第22节】FFT频偏估计方法,导频+cordic频偏估计方法,costas环的性能对比

频偏范围适应性:Costas 环频偏锁定和基于 PN 导频和 CORDIC 算法的频偏估计都可以通过调整参数来适应一定范围的频偏,但 Costas 环的频率捕获范围相对较窄,而基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计对频偏范围较大。在高信噪比条件下,三种方法都可以获得较高的估计精度,但在低信噪比环境中,基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计这两个开环方案相对更具优势,而Costas 环频偏锁定的精度可能会受到较大影响.

FPGA/MATLAB学习教程/源码/项目合作开发 610

java任务最短完成时间_Java异步任务优化CompletionService

上一篇详细介绍了Future与Callable,而CompletionService则对它们的优化。Future的缺陷Future通过get方法来获取异步任务的结果,如果任务还没有完成则阻塞线程,因为我们需要它的结果,所以等待是应该的。如果需要处理一批这类任务,提交到线程池我们最终会得到多个Future,但是每个任务执行的时间可能并不相同,那么我们应该优先调用哪个Future的get呢?示例如下图...

weixin_42370743的博客 339

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

怎样通过CompletableFuture优化Java异步任务的编排与结果聚合?

​​模式匹配​​:根据任务依赖选择流水线、扇出或分支模式。​​线程隔离​​:为 IO/CPU 任务分配独立线程池,避免资源竞争。​​防御式编程​​:通过异常链、超时、降级保证鲁棒性。​​监控驱动​​:实时跟踪线程池状态,动态调整参数。

iddlw75046的博客 1064

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

异步任务_Java异步任务优化CompletionService

上一篇详细介绍了Future与Callable,而CompletionService则对它们的优化。Future的缺陷Future通过get方法来获取异步任务的结果,如果任务还没有完成则阻塞线程,因为我们需要它的结果,所以等待是应该的。如果需要处理一批这类任务,提交到线程池我们最终会得到多个Future,但是每个任务执行的时间可能并不相同,那么我们应该优先调用哪个Future的get呢?示例如下图...

weixin_30299099的博客 162

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 异步任务队列_Java异步任务优化CompletionService

上一篇详细介绍了Future与Callable,而CompletionService则对它们的优化。Future的缺陷Future通过get方法来获取异步任务的结果,如果任务还没有完成则阻塞线程,因为我们需要它的结果,所以等待是应该的。如果需要处理一批这类任务,提交到线程池我们最终会得到多个Future,但是每个任务执行的时间可能并不相同,那么我们应该优先调用哪个Future的get呢?示例如下图...

weixin_33316051的博客 303

《探究Java在分布式系统中的异步任务处理与性能优化策略》

以一个电子商务平台为例,订单处理是一个典型的异步任务。本文旨在深入探讨Java在分布式系统中的异步任务处理机制,并提出有效的性能优化策略,以提高系统的吞吐量和响应速度。异步任务处理是指将耗时的操作从主线程中分离,通过后台线程或外部系统执行,从而避免阻塞主线程,提高系统的并发能力。为了优化异步任务的性能,首先需要合理配置线程池参数,如核心线程数、最大线程数和队列容量,以避免资源耗尽或过度竞争。通过合理利用Java提供的并发工具和分布式技术,结合有效的优化策略,开发者可以构建出高效、稳定的异步处理系统。

mmmmmmmmmm的专栏 301

Java异步任务优化CompletionService

上一篇详细介绍了Future与Callable,而CompletionService则对它们的优化。​

IT乐知 298

Java 8 CompletableFuture实战:如何用线程池优化你的异步任务性能

本文深入探讨了Java 8 CompletableFuture如何通过合理配置线程池来优化异步任务性能。从基础原理到实战策略,详细解析了线程池参数设置、任务类型适配及高级优化技巧,帮助开发者提升高并发场景下的系统性能。特别适合需要处理多线程任务的Java开发者参考。

weixin_29271053的博客 236

java异步任务库_Java异步任务优化CompletionService

ExecutorCompletionService源码从上面的例子可以看到使用ExecutorCompletionService有三个关键步骤:设置一个线程池、submit提交任务、take获取完成的Future。看源码首先看他的属性,查看源码得到他有两个关键属性:Executor executor:执行线程的线程池;BlockingQueue completionQueue:阻塞队列,保存完成的...

weixin_29513663的博客 144

Java高性能任务调度实战:异步执行与线程池优化代码解析

Java结合线程池、异步执行和批量任务处理,可以构建高性能任务调度系统。通过合理调优线程池和任务管理,开发者能够实现稳定、高效的调度服务,适用于定时任务、异步任务处理和高并发任务调度场景。实践这些方法,可显著提升系统吞吐量和任务执行效率。

2501_94114861的博客 418

Java异步任务同步优化:LatchUtils设计与实践

在Java并发编程中,异步任务同步是提升系统吞吐量的关键技术,其核心在于解决多线程协作时的状态管理问题。通过CountDownLatch等同步器可实现任务编排,但传统实现常面临回调嵌套和资源泄漏等痛点。本文介绍的LatchUtils工具类基于ThreadLocal实现线程安全的任务队列,采用关注点分离设计理念,将任务提交与同步等待解耦。该方案在电商详情页聚合等IO密集型场景中,能使响应时间降低40%以上,同时支持灵活的超时策略和线程池配置。对于需要协调多个微服务调用的分布式事务、批量数据处理等场景,此类工具

weixin_34072296的博客 240

JAVA代码优化:异步任务管理器

使用SpringUtils.getBean("scheduledExecutorService")从Spring容器中获取了一个ScheduledExecutorService实例作为异步操作任务调度线程池。实现了一个简单的异步任务管理器,通过调度线程池来执行异步任务,并提供了对任务调度线程池的关闭方法。方法:用于执行任务,接收一个TimerTask类型的任务对象,并将其提交到任务调度线程池中,延迟10毫秒后执行。异步任务管理器(AsyncManager),用于执行异步任务并管理任务调度线程池。

码字码字码字 1252

Java 异步任务工厂(三)线程管理深度优化

Java 异步任务工厂(三)线程管理深度优化

Yeats_Liao的博客 1209

[Java编程中的高效多线程异步任务处理与性能优化实践]

此外,java.util.concurrent包提供了高性能的并发容器(如ConcurrentHashMap)和同步工具类(如CountDownLatch、CyclicBarrier),这些工具经过高度优化,能够在高并发场景下提供更好的性能,减少显式同步的需要。Java 8引入的CompletableFuture更进一步,支持非阻塞的异步编程,允许通过回调方式组合多个异步操作,构建复杂的异步工作流,极大地提升了程序的响应性和吞吐量。理解线程的创建、生命周期管理以及共享资源访问是高效多线程编程的基石。

lawczj的博客 354
上一篇: Springboot之联调对接字符串的坑
下一篇: maven编译打包问题
devilnumber
博客等级 码龄12年 20粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值