广告
返回顶部
首页 > 资讯 > 精选 >Java SpringBoot @Async如何实现异步任务
  • 196
分享到

Java SpringBoot @Async如何实现异步任务

2023-07-04 21:07:42 196人浏览 八月长安
摘要

本篇内容介绍了“Java SpringBoot @Async如何实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

本篇内容介绍了“Java SpringBoot @Async如何实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

依赖pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="Http://Maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-WEB</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

1、同步任务

应用启动类

package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

同步任务,耗时2秒

package com.example.demo.service;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.AsyncResult;import org.springframework.stereotype.Service;import java.util.concurrent.Future;@Service@Slf4jpublic class TaskService {        public void syncTask() throws InterruptedException {        Thread.sleep(1000 * 2);        System.out.println("syncTask");    }}

控制器

package com.example.demo.controller;import com.example.demo.service.TaskService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;@RestController@RequestMapping("/task")@Slf4jpublic class TaskController {    @Autowired    private TaskService taskService;    @GetMapping("/syncTask")    public String syncTask() throws InterruptedException {        long start = System.currentTimeMillis();        taskService.syncTask();        long end = System.currentTimeMillis();        log.info("time: {}", end - start);        return "success";    }}

请求接口:等待2秒后返回

GET http://localhost:8080/task/syncTaskAccept: application/JSON·

2、@Async 异步任务-无返回值

启动类需要加上注解:@EnableAsync

package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication@EnableAsyncpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

异步任务

package com.example.demo.service;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.AsyncResult;import org.springframework.stereotype.Service;import java.util.concurrent.Future;@Service@Slf4jpublic class TaskService {        @Async    public void asyncTask() throws InterruptedException {        Thread.sleep(1000 * 2);        System.out.println("asyncTask");    }}

控制器

package com.example.demo.controller;import com.example.demo.service.TaskService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;@RestController@RequestMapping("/task")@Slf4jpublic class TaskController {    @Autowired    private TaskService taskService;    @GetMapping("/asyncTask")    public String asyncTask() throws InterruptedException {        long start = System.currentTimeMillis();        taskService.asyncTask();        long end = System.currentTimeMillis();        log.info("time: {}", end - start);        return "success";    }}

请求接口:无等待,直接返回

GET http://localhost:8080/task/asyncTaskAccept: application/json

3、@Async 异步任务-有返回值

异步任务

package com.example.demo.service;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.AsyncResult;import org.springframework.stereotype.Service;import java.util.concurrent.Future;@Service@Slf4jpublic class TaskService {      @Async   public Future<String> asyncTaskFuture() throws InterruptedException {       Thread.sleep(1000 * 2);       System.out.println("asyncTaskFuture");       return new AsyncResult<>("asyncTaskFuture");   }}

控制器

package com.example.demo.controller;import com.example.demo.service.TaskService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;@RestController@RequestMapping("/task")@Slf4jpublic class TaskController {    @Autowired    private TaskService taskService;    @GetMapping("/asyncTaskFuture")    public String asyncTaskFuture() throws InterruptedException, ExecutionException {        long start = System.currentTimeMillis();        Future<String> future = taskService.asyncTaskFuture();        // 线程等待结果返回        String result = future.get();        long end = System.currentTimeMillis();        log.info("time: {}", end - start);        return result;    }}

请求接口:等待2秒后返回

GET http://localhost:8080/task/asyncTaskFutureAccept: application/json

4、@Async + 自定义线程池

package com.example.demo.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;@Configurationpublic class ExecutorAsyncConfig {    @Bean(name = "newAsyncExecutor")    public Executor newAsync() {        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();        // 设置核心线程数        taskExecutor.setCorePoolSize(10);        // 线程池维护线程的最大数量,只有在缓冲队列满了以后才会申请超过核心线程数的线程        taskExecutor.setMaxPoolSize(100);        // 缓存队列        taskExecutor.setQueueCapacity(50);        // 允许的空闲时间,当超过了核心线程数之外的线程在空闲时间到达之后会被销毁        taskExecutor.seTKEepAliveSeconds(200);        // 异步方法内部线程名称        taskExecutor.setThreadNamePrefix("my-xiaoxiao-AsyncExecutor-");        // 拒绝策略        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        taskExecutor.initialize();        return taskExecutor;    }}

异步任务

package com.example.demo.service;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.AsyncResult;import org.springframework.stereotype.Service;import java.util.concurrent.Future;@Service@Slf4jpublic class TaskService {      @Async("newAsyncExecutor")   public void asyncTaskNewAsync() throws InterruptedException {       Thread.sleep(1000 * 2);       System.out.println("asyncTaskNewAsync");   }}

控制器

package com.example.demo.controller;import com.example.demo.service.TaskService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;@RestController@RequestMapping("/task")@Slf4jpublic class TaskController {    @Autowired    private TaskService taskService;    @GetMapping("/asyncTaskNewAsync")    public String asyncTaskNewAsync() throws InterruptedException {        long start = System.currentTimeMillis();        taskService.asyncTaskNewAsync();        long end = System.currentTimeMillis();        log.info("time: {}", end - start);        return "success";    }}

请求接口:无等待,直接返回

GET http://localhost:8080/task/asyncTaskNewAsyncAccept: application/json

5、CompletableFuture 实现异步任务

不需要在启动类上加@EnableAsync 注解,也不需要在方法上加@Async 注解

控制器

package com.example.demo.controller;import com.example.demo.service.TaskService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;@RestController@RequestMapping("/task")@Slf4jpublic class TaskController {    @GetMapping("/completableFuture")    public String completableFuture(){        long start = System.currentTimeMillis();        // CompletableFuture实现异步任务        CompletableFuture<Void> result = CompletableFuture.runAsync(() -> {            try {                Thread.sleep(1000 * 2);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("CompletableFuture");        });        long end = System.currentTimeMillis();        log.info("time: {}", end - start);        return "success";    }}

“Java SpringBoot @Async如何实现异步任务”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java SpringBoot @Async如何实现异步任务

本文链接: https://www.lsjlt.com/news/347544.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java SpringBoot @Async如何实现异步任务
    本篇内容介绍了“Java SpringBoot @Async如何实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2023-07-04
  • Java SpringBoot @Async实现异步任务的流程分析
    目录1、同步任务2、@Async 异步任务-无返回值3、@Async 异步任务-有返回值4、@Async + 自定义线程池5、CompletableFuture 实现异步任务依赖po...
    99+
    2022-12-27
    SpringBoot @Async异步任务 SpringBoot异步任务
  • SpringBoot 实现异步任务
    异步任务 一、使用背景二、同步任务的优缺点2.1 优点2.2 缺点2.3 总结 三、异步任务的优缺点3.1 优点3.2 缺点3.3 总结 四、Spring Boot 实现异步任务4.0...
    99+
    2023-10-09
    spring boot java spring
  • springboot实现异步任务
    本文实例为大家分享了springboot实现异步任务的具体代码,供大家参考,具体内容如下 1.什么异步任务 同步:一定要等任务执行完了,得到结果,才执行下一个任务。 异步:不等任务执...
    99+
    2022-11-12
  • springboot怎么实现异步任务
    这篇“springboot怎么实现异步任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么实现异步任务...
    99+
    2023-06-29
  • springboot @Async 注解如何实现方法异步
    目录@Async注解如何实现方法异步一、springboot的App类需要的注解二、service层的注解三、调用层异步注解@Async的使用以及注意事项第一步开启异步下面显示配置线...
    99+
    2022-11-12
  • 详细讲解springboot如何实现异步任务
    目录Spring Boot介绍Spring Boot特点异步任务Spring Boot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 ...
    99+
    2022-11-13
  • springboot定时任务和异步任务怎么实现
    这篇文章主要介绍“springboot定时任务和异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot定时任务和异步任务怎么实现”文章能帮助大家解决问题。异步任务简单案例...
    99+
    2023-06-27
  • 详解springboot通过Async注解实现异步任务及回调的方法
    目录前言什么是异步调用?1. 环境准备2. 同步调用3. 异步调用4. 异步回调前言 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必...
    99+
    2022-11-13
  • SpringBoot异步任务及并行事务实现
            上一篇介绍了原生Java如何实现串行/并行任务,主要使用了线程池 + Future + CountDownLatch,让主线程等待子线程返回后再向下进行。而在SpringBoot中,利用@Async和AOP对异步任务提供了更...
    99+
    2023-09-05
    java spring boot mysql
  • Springboot异步任务和定时任务如何处理
    本文小编为大家详细介绍“Springboot异步任务和定时任务如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot异步任务和定时任务如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1...
    99+
    2023-06-30
  • 一文搞懂SpringBoot如何利用@Async实现异步调用
    目录前言简单使用异步处理异步回调自定义线程池注意事项(一定注意)前言 异步调用几乎是处理高并发,解决性能问题常用的手段,如何开启异步调用?SpringBoot中提供了非常简单的方式,...
    99+
    2022-11-13
  • Android中如何实现异步任务
    Android中如何实现异步任务,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。为了解决新线程不能更新UI组件的问题,Android提供了几种解决方案使用HanlderAci...
    99+
    2023-06-04
  • springboot为异步任务规划自定义线程池如何实现
    本篇内容主要讲解“springboot为异步任务规划自定义线程池如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot为异步任务规划自定义线程池如何实现”吧!一、Spring...
    99+
    2023-07-02
  • java异步任务实例分析
    本篇内容主要讲解“java异步任务实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java异步任务实例分析”吧!一、什么是异步任务无论是生活中还是程序里,大体可以分为两种 : 同步和异步。...
    99+
    2023-06-30
  • SpringBoot详细讲解异步任务如何获取HttpServletRequest
    目录原因分析解决方案前置条件pom配置requrest共享自定义request过滤器自定义任务执行器调用示例原因分析 @Anysc注解会开启一个新的线程,主线程的Request和子线...
    99+
    2022-11-13
  • Django怎么实现异步任务
    本篇内容介绍了“Django怎么实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 对于网站来说...
    99+
    2022-10-19
  • Flask实现异步执行任务
    Flask 是 Python 中有名的轻量级同步 web 框架,在一些开发中,可能会遇到需要长时间处理的任务,此时就需要使用异步的方式来实现,让长时间任务在后台运行,先将本次请求的响...
    99+
    2022-11-12
  • python异步任务怎么实现
    在Python中,可以使用协程(Coroutine)和异步IO来实现异步任务。首先,需要使用`async`关键字定义一个协程函数(C...
    99+
    2023-09-22
    python
  • android异步任务怎么实现
    在Android中,可以使用AsyncTask类来实现异步任务。下面是一个简单的示例:1. 创建一个继承自AsyncTask的子类,...
    99+
    2023-08-18
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作