异步任务概念及实现

SpringBoot(十三)异步任务 阅读详情
AI摘要

本文详细介绍了同步和异步编程的概念,并通过实例展示了如何通过继承Thread、实现Runnable和Callable接口以及使用线程池实现异步。重点讲解了Future和CompletableFuture在获取异步任务返回值的应用,适合深入理解Java异步编程。

一、什么是同步和异步

  • 同步是阻塞模式,异步是非阻塞模式。
  • 同步就是指程序在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会—直等待下去,知道收到返回信息才继续执行下去。
  • 异步就是程序调用一个耗时较长的功能(方法)时,它并不会阻塞程序的执行流程,程序会继续往下执行。当功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果(如果有返回值或需要返回值时)。

下面通过一个示例来看一下同步和异步的区别。示例中程序通过网络获取两个文件,并对两个文件进行合并处理:

异步与同步

二、实现异步的四种方式 

1、继承Thread类

public class TestDemo {
    public static void main(String[] args) {
        System.out.println("main...start....");
        new Thread01().start();
        System.out.println("main...end....");
    }
    /**
     * 继承Thread
     */
    public static class Thread01 extends Thread {
        @Override
        public void run() {
            System.out.println("当前线程:" + Thread.currentThread().getId());
        }
    }
}

2、实现Runnable接口

public class TestDemo {
    public static void main(String[] args) {
        System.out.println("main...start....");
        new Thread(new Runnable01()).start();
        System.out.println("main...end....");
    }
    /**
     * 实现Runnable接口
     */
    public static class Runnable01 implements Runnable{
        @Override
        public void run() {
            System.out.println("当前线程:" + Thread.currentThread().getId());
        }
    }
}

3、实现Callable接口 

public class TestDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main...start....");
        new Thread(new Callable01()).start();
        System.out.println("main...end...." );
    }

    /**
     * 实现Callable接口 
     */
    public static class Callable01 implements Callable<Integer> {
        @Override
        public void call() throws Exception {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            return 0;
        }
    }
}

4、线程池

        1、通过Executors工具类创建固定的线程池,例如:

// 带缓存的线程池,可以灵活回收线程
ExecutorService pool1 = Executors.newCachedThreadPool();
// 固定大小的线程池
ExecutorService pool2 = Executors.newFixedThreadPool(10);
// 定时任务的线程池
ScheduledExecutorService pool3 = Executors.newScheduledThreadPool(10);
// 单线程的线程池,从队列中获取任务挨个执行
ExecutorService pool4 = Executors.newSingleThreadExecutor();

        2、通过原生的方式创建线程池:(推荐)

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    //核心线程数,线程池创建好以后准备就绪的线程数
    5,
    //最大线程数,控制资源
	200,
    //存活时间,线程空闲时间超过设定的值,该线程就会被释放
	10,
    //时间单位
	TimeUnit.SECONDS,
    //阻塞队列,将多余的任务放在队列中等待执行
	new LinkedBlockingQueue<>(),
    //线程的创建工厂
	Executors.defaultThreadFactory(),
    //当队列满了后,按照指定的拒绝策略拒绝执行任务
	new ThreadPoolExecutor.AbortPolicy());

三、获取异步任务的返回值

1、Future

        a、基于@Async的有返回值的异步方法

@Async
public Future<String> asyncMethodWithReturnType() {
    System.out.println("Execute method asynchronously - "  + Thread.currentThread().getName());
    try {
        Thread.sleep(5000);
        return new AsyncResult<String>("hello world !!!!");
    } catch (InterruptedException e) {
        //
    }

    return null;
}

        b、  获取上述方法的返回值

public void testAsyncAnnotationForMethodsWithReturnType()
   throws InterruptedException, ExecutionException {
    System.out.println("Invoking an asynchronous method. "   + Thread.currentThread().getName());
    Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType();

    while (true) {  ///这里使用了循环判断,等待获取结果信息
        if (future.isDone()) {  //判断是否执行完毕
            System.out.println("Result from asynchronous process - " + future.get());
            break;
        }
        System.out.println("Continue doing something else. ");
        Thread.sleep(1000);
    }
}

2、CompletableFuture异步编排 

Java 8新增的CompletableFuture类正是吸收了所有Google Guava中ListenableFuture和SettableFuture的特征,还提供了其它强大的功能,让Java拥有了完整的非阻塞编程模型:Future、Promise 和 Callback(在Java8之前,只有无Callback 的Future)。

CompletableFuture能够将回调放到与任务不同的线程中执行,也能将回调作为继续执行的同步函数,在与任务相同的线程中执行。它避免了传统回调最大的问题,那就是能够将控制流分离到不同的事件处理器中。

CompletableFuture弥补了Future模式的缺点。在异步的任务完成后,需要用其结果继续操作时,无需等待。可以直接通过thenAccept、thenApply、thenCompose等方式将前面异步处理的结果交给另外一个异步事件处理线程来处理

详情见:Java8 CompletableFuture 用法全解、CompletableFuture使用详解

     

SpringBoot 中异步任务实现及自定义线程池执行异步任务 java复制代码import org.springframework.context.annotation.Bean;// 核心线程数// 最大线程数// 任务队列大小// 线程池名称前缀// 允许线程的空闲时间/*** 拒绝处理策略* CallerRunsPolicy():交由调用方线程运行,比如 main 线程。* AbortPolicy():直接抛出异常。* DiscardPolicy():直接丢弃。 阅读详情

相关推荐

Spring Boot的异步与定时任务!

🏆 本文精选收录于《滚雪球学SpringBoot》专栏,专为零基础学习者量身打造。从Spring基础到项目实战,手把手带你掌握核心技术,助力你快速提升,迈向职场巅峰,开启财富自由之路🚀!无论你是刚入门的小白,还是已有基础的开发者,都能在这里找到适合自己的学习路径!    🌟 关注、收藏、订阅,持续更新中!和我们一起高速成长,突破自我!💡

**My Coding Family** 1464

11 |「异步任务与多线程」

异步任务与多线程

小Y的博客 1435

Flask后端开发中的异步任务处理框架

在现代Web应用开发中,用户体验和系统性能至关重要。作为轻量级Python Web框架的代表,Flask以其简洁灵活的特性深受开发者喜爱。然而,当面临耗时操作(如邮件发送、数据处理、文件转换等)时,传统的同步处理方式会导致请求阻塞,严重影响用户体验。本文将深入探讨Flask后端开发中的异步任务处理机制,从核心概念解析到主流框架(Celery、RQ、Huey)的实战应用,帮助开发者构建高性能、响应迅速的Web应用。

架构师的AI之路,分享AI应用开发架构的学习与实践。 1134

什么是异步任务?具体开发中有哪些运用呢?

其中,Celery是一个比较流行的异步任务处理库,也是我最喜欢的一个相关处理库,功能强大,工具优化流畅,它可以用于分布式任务队列、定时任务、爬虫等应用场景。通过Celery,可以将任务分发到不同的节点上执行,提高任务的并发处理能力。在实际开发中,也可以根据具体应用场景选择合适的异步任务处理方式,比如,使用异步框架FastAPI、Tornado等,或者使用异步库asyncio、aiohttp、gevent等。异步任务是指可以在一个进程中并发执行的任务,可以通过不同的方式来实现,如多线程、多进程、协程等。

m0_73291751的博客 1940

fpga学习——zynq图像处理中的DVP流接口封装

之前文章介绍了基于zynq的图像处理架构问题。其中,作为开发者,需要重点关注图像传感器接口、处理算法、显示接口,这些模块。现在我们一同学习用于视频数据接口的DVP模块,并将其封装成AXI-stream接口便于直接和VDMA IP通信。 DVP_AXI stream IP v1.0使用说明 1.设计概述 •用于cmos传感器视频数据采集,将cmos输出的8位视频数据拼接成RGB 565模式 •AXI_stream主机接口,用于和PS端内存的数据交互 •基于vivado 18.3软件设计 2.模块分析

weixin_41895751的博客 4582

.NET+Vue企业级RBAC权限平台:开箱即用的生产就绪方案

RBAC(基于角色的访问控制)是企业系统安全治理的基础模型,其核心在于将用户、角色与权限解耦,通过动态能力组合实现细粒度管控。在真实工程中,RBAC需突破静态角色限制,支持时间维度授权、前后端双重鉴权、行级数据范围控制等关键能力。本文聚焦于一套已落地金融、政务、制造等多行业的生产级实现——基于.NET Minimal API与Vue 3的前后端分离架构,提供菜单/按钮/接口/数据四层权限控制,内置滑动过期JWT、Redis权限缓存、动态路由加载与权限指令等开箱即用能力,显著降低权限配置与审计成本。

weixin_33326218的博客 276

Java异步任务详解

异步任务指的是不阻塞当前线程,任务提交后会在后台线程执行,主线程可以继续执行其他操作。异步任务通常用于提高应用程序的响应性和效率。通过这些方法,Java 中的异步任务可以有效地提高应用程序的性能和响应性,但同时也需要注意并发编程的各种潜在问题。

qq_44082755的博客 1297

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端【SSO单点登录时作为客户端】

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端【SSO单点登录时作为客户端】

Mr_XiMu的博客 3742

异步、并发、多线程、多进程是现代编程中实现“同时处理多个任务”的四种核心概念。

并发是目标,手段有三种异步:单线程玩转高并发(I/O 场景王者);多线程:轻量并发,小心 GIL 和锁;多进程:重武器,专治 CPU 密集型。Python 选型口诀I/O 用异步,CPU 用多进程,简单并发可线程。

m0_73161433的博客 601

TBtools的序列提取步骤

本教程详细介绍了如何使用TBtools软件从原来的FASTA序列中提取特定的DNA序列。

weixin_47509995的博客 1万+

YOLOv8模型部署与测试:保姆级教程(含Ultralytics配置避坑指南)

本文提供了一份详尽的YOLOv8模型部署与测试指南,涵盖环境配置、模型加载、参数优化、批量处理及API服务封装等关键步骤。重点分享了Ultralytics框架在实际部署中的常见问题与解决方案,帮助开发者高效完成从训练到生产的过渡,确保模型在真实场景中稳定运行。

weixin_29038155的博客 293

异步任务:JavaScript编程的效率提升器

本文将介绍JavaScript中异步任务的概念和用法,以及它们在实际开发中的应用。在JavaScript开发中,异步任务是实现高效编程的关键。了解异步任务的概念和用法对于开发者来说具有重要意义。掌握异步任务的使用可以帮助我们更高效地处理耗时的操作,提高应用程序的响应速度。

你若盛开,清风自来 991

目标检测基础

目标检测是计算机视觉的核心任务,需同时对图像中的物体进行定位与识别。传统方法存在速度慢、精度低等问题,而深度学习显著推动了该领域发展,使实时高精度检测成为可能。检测的核心是为每个物体预测边界框坐标和类别标签。为实现高效检测,引入了锚框机制,通过预设多尺度、多宽高比的候选区域,缩小预测偏移量,提升定位精度。训练时,通过计算锚框与真实边界框的交并比 (IoU) 确定正负样本,并基于此生成类别标签和坐标偏移量作为监督信号。该方法提升了检测器对多尺度目标和复杂场景的鲁棒性。

盼小辉丶的博客 2764

JS中的同步任务和异步任务的概念以及区别

JS中的同步和异步 单线程语言 js是一门单线程语言,所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。如果一个任务耗时过长,那么后面的任务就必须一直等待下去,会拖延整个程序,常见浏览器无反应,可能就是一段代码死循环,造成程序卡住在这个位置,无法继续。而js之所以会是单线程语言的原因和它的用途有很大的关系,我们都知道,JavaScript作为浏览器的脚本语言,主要用来实现与用户的交互,利用JavaScript,我们可以实现对DOM的各种各

zzh1251994430的博客 1514

论文翻译:Automatic Lesson Plan Generation via Large Language Models with Self-critique Prompting

在本文中,我们利用大型语言模型(LLMs)的理解和生成能力来自动生成定制化的课程计划。这解决了传统计划可能无法充分满足不同教学环境和学生群体的特定需求的常见挑战。我们提出了一个新颖的三阶段过程,包括使用检索增强生成(RAG)逐步生成课程计划的每个关键组成部分,通过LLMs进行自我批评,以及随后的细化。我们使用这种方法为小学2至5年级生成了涵盖80多个主题的数学课程计划。邀请了三位经验丰富的教育工作者制定全面的课程计划评估标准,然后使用这些标准将我们的LLM生成的课程计划与同一主题的实际课程计划进行基准比较。

CSPhD-winston的博客 1101

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2763

SpringBoot实现异步任务

一.异步和同步 异步(async)是相对于同步(sync)来说的,简单理解,同步是串行的,异步是并行的。 好比说,A需要从B和C两个节点获取数据 第一种方式,A请求B,B返回给A数据,A再去请求C,在从C出获得数据。这种方式就是同步。 另一种方式,A去请求B,不等B返回数据,就去请求C,然后等B和C准备好数据再推送给A,A同样可以拿到B和C的数据,这就是异步。 注意,第二种方式B和C是同时处理A的请求的,是比第一种方式效率要高的,但是这种方式,有一个限制,就是从B和C之间要获取的数据不能有依赖关系

小石潭记丶 4269

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

鸿蒙中的任务队列与异步处理

随着现代应用的复杂性增加,尤其是在需要进行大量后台处理的应用中,任务队列和异步处理已成为不可或缺的工具。在鸿蒙操作系统中,任务队列和异步处理不仅可以提高应用的性能,还能提升用户体验,避免界面卡顿。使用异步处理可以确保耗时操作在后台执行,避免主线程被阻塞,从而保持应用的流畅性。本文将介绍鸿蒙中任务队列与异步任务的管理方法,如何使用实现任务队列,如何调度与执行异步任务,并通过代码示例演示如何在鸿蒙中实现任务队列与异步任务处理。任务队列:在鸿蒙中,可以通过。

2201_75863687的博客 939

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot 实现 异步任务、邮件发送任务、定时任务

写在前面(代码可直接运行) 异步任务+邮件发送任务+定时任务:springboot-08-test 如果觉得对您有帮助,请点个赞支持一下: 文章目录一. 异步任务1.1 简介 - 何为异步任务1.2 代码实现二. 邮件发送任务2.1 一般步骤2.2 测试三. 定时任务3.1 简介3.2 Cron 表达式3.3 测试 一. 异步任务 1.1 简介 - 何为异步任务 异步任务,与同步任务相对。 同步任务:等后台执行结束,前台在显示 异步任务:前台先显示,后台继续在运行代码。 1.2 代码实现 在Sp

Kc635908933的博客 396

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringBoot异步处理任务

名词解释 1)同步:等用户所有操作结束后,才会返回程序的处理状态。 2)异步:直接返回给用户指定的状态,同时程序在后台继续运行,用户不用等待。 实现 同步实现 @Autowired private TaskAsync taskAsync; /** * 同步处理的方式 */ @GetMapping("/test2") public String test2() { taskAsync.getTest2(); System.out.println(Thread.cu

浅汐 7万+

springboot异步任务的实现

1.什么异步任务 同步:一定要等任务执行完了,得到结果,才执行下一个任务。 异步:不等任务执行完,直接执行下一个任务。 2.异步任务使用场景 在许多网站中,都会有发送邮件验证邮箱功能,执行该任务时,需要较长的时间,此时为了更好的用户体验,前端可以先返回完成的信息,后台去执行任务。 3.异步任务的实现步骤 首先模拟一个网站跳转的过程,假设某一个线程执行任务时需要5秒,结束以后才会进行下一步操作,我们令线程休眠五秒,然后通过controller进行页面跳转 service package com.kuang.

微滑低的博客 703

celery异步,延时任务, 周期任务

  celery中文译为芹菜,是一个分布式任务队列.是异步的,所以能处理大量消息   最新的celery不支持windows下使用了,所以在使用pycharm安装celery模块之后,需要再安装eventlet模块才能测试运行. 一.异步任务 启动客户端: s1,s2要在项目目录下,如果在文件夹中执行,terminal输入命令的时候要-A项目文件夹的名字 c=Celery("ta...

weixin_30517001的博客 528

flask Celery入门:轻松实现异步任务处理

本文介绍了使用Celery实现分布式任务队列的基本方法。Celery是一个基于Python的异步任务队列框架,适用于邮件发送、文件处理等耗时操作。文章详细讲解了Celery的安装配置(需安装Redis作为消息代理),项目结构设计,以及如何定义异步任务。示例代码展示了在Flask应用中集成Celery,包括任务触发和状态查询接口的实现。通过这种方案,可以将耗时任务异步化处理,提升系统性能和用户体验。文章还提供了启动服务的具体命令,帮助读者快速搭建完整的Celery应用环境。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1228

python2处理耗时任务_如何实现异步任务处理来解决耗时操作问题

今天说一个在实际项目中特别实用的解决并发耗时问题的办法:异步任务处理。这里采用 redis list 结构来实现。涉及知识点:1、redis list 结构2、阻塞、非阻塞、同步、异步的概念3、如何实现一个异步处理任务实战同步、异步、阻塞、非阻塞首先来说同步和异步,这两个概念是针对通信双方消息传送的响应来说的,如果 A 请求 B,B 马上响应 A,这是同步,而如果 A 请求 B ,B 说好的,我已...

weixin_39888412的博客 603

多线程实现异步任务管理器

异步任务管理器就是一个可以快速创建异步任务的一个工具提高业务系统响应速度,实现不同业务之间的解耦记录访客日志,发送工单等 如果系统每一步的日志记录都是伴随着业务一起执行的,那么当系统访问量增的时候,就会大大降低系统的响应速度 因为写操作是比读操作更耗时的,如果能够做到异步的记录日志,就不必等待日志记录完成即可返回查询、搜索结果,异步任务可以通过多线程也可以通过消息队列配合定时任务来实现,但是相对于小型系统采用多线程的方式相对便捷自定义线程池实现了单例模式获取自定义线程池对象,以及通过该单例对象初始化一个线程

小陈没烦恼 1659

【SpringBoot】SpringBoot的异步任务、邮件发送、定时任务

本文介绍了SpringBoot中异步任务、邮件发送和定时任务的实现方法。在异步任务部分,通过@Async注解实现后台多线程处理;邮件发送部分详细讲解了SMTP协议配置和JavaMailSender的使用;定时任务部分重点介绍了cron表达式的语法及@Scheduled注解的应用。文中通过具体项目示例,展示了从依赖引入、配置设置到功能测试的完整流程,并提供了常见问题的解决方案(如QQ邮箱授权码设置)和实用工具推荐(cron表达式生成器)。这些功能的实现大幅提升了Web应用的响应速度和自动化能力。

杨DaB的博客 793
上一篇: PO、VO、BO、DTO 和 POJO的概念和用处
下一篇: CompletableFuture用法
Alt__
博客等级 码龄7年 16粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值