spring常用注解(八)@Async

news2024/12/29 10:49:42

一、介绍

1、介绍

二、原理

三、集成与使用

1、集成方法

(1)开启

使用以下注解开启

@EnableAsync

(2)使用

在需要异步处理的方法上加上

@Async
2、返回值
@Async注解的方法返回值只能为void或者Future<T>。

(1)无返回值

(2)有返回值

使用AsyncResult包装下得到Future对象返回;调用处使用get方法获取。

3、demo
(1)初始化线程池

如我初始化了两个,分别在user模块、order模块使用

package com.demo.thread.constant;

public class ThreadPoolConstant {

    public static final String USER_POOL = "userPool";

    public static final String ORDER_POOL = "orderPool";
}
package com.demo.thread.config;

import com.demo.thread.constant.ThreadPoolConstant;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {
    private static int CORE_POOL_SIZE = 5;
    private static int MAX_POOL_SIZE = 10;

    @Bean(name= ThreadPoolConstant.USER_POOL)
    public ThreadPoolTaskExecutor userTaskExecutor(){
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量
        poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        //线程池维护线程的最大数量
        poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        //线程池所使用的缓冲队列
        poolTaskExecutor.setQueueCapacity(200);
        //线程池维护线程所允许的空闲时间
        poolTaskExecutor.setKeepAliveSeconds(30000);
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        poolTaskExecutor.setBeanName(ThreadPoolConstant.USER_POOL);
        return poolTaskExecutor;
    }

    @Bean(name= ThreadPoolConstant.ORDER_POOL)
    public ThreadPoolTaskExecutor orderTaskExecutor(){
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量
        poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        //线程池维护线程的最大数量
        poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        //线程池所使用的缓冲队列
        poolTaskExecutor.setQueueCapacity(200);
        //线程池维护线程所允许的空闲时间
        poolTaskExecutor.setKeepAliveSeconds(30000);
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        poolTaskExecutor.setBeanName(ThreadPoolConstant.ORDER_POOL);
        return poolTaskExecutor;
    }
}
(2)service
package com.demo.thread.service.impl;

import com.demo.thread.constant.ThreadPoolConstant;
import com.demo.thread.service.UserService;
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.ArrayList;
import java.util.List;
import java.util.concurrent.Future;

@Service("userService")
@Slf4j
public class UserServiceImpl implements UserService {

    @Override
    @Async(ThreadPoolConstant.USER_POOL)
    public void create()  {
        log.info("user create开始...");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("user create结束...");
    }

    @Override
    @Async(ThreadPoolConstant.USER_POOL)
    public Future<List<String>> query()  {
        log.info("user query 开始...");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        List<String> userIds = new ArrayList<>();
        userIds.add("zs");
        userIds.add("ls");
        Future<List<String>> users = new AsyncResult(userIds);
        log.info("user query 结束...");
        return users;
    }
}
(3)controller
package com.demo.thread.controller;

import com.demo.thread.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@RestController
@RequestMapping("/test")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/create")
    public void create() {
        log.info("测试create开始");
        userService.create();
        log.info("测试create结束");
    }

    @RequestMapping("/query")
    public void query() {
        log.info("测试query开始");
        Future<List<String>> users = userService.query();
        log.info("调用query结束");
        try {
            List<String> userIds = users.get();
            log.info("query结果为:{}",userIds);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
        log.info("测试query结束");
    }
}
(4)启动类
package com.demo.thread;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ThreadApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(ThreadApplicationStart.class, args);
    }
}
(5)测试

无返回值:访问localhost:8080/test/create控制台输出:

有返回值:访问localhost:8080/test/query控制台输出:可以看到feture取结果会阻塞主线程,其他则按执行顺序打印

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1811901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻松实现App推广代理结算,Xinstall超级渠道功能助您一臂之力!

在App推广的广阔天地中&#xff0c;与渠道方建立合作关系&#xff0c;共同实现用户增长和品牌提升&#xff0c;已成为众多开发者和广告主的共识。然而&#xff0c;如何高效管理这些渠道、监测推广效果、实现代理结算&#xff0c;一直是困扰大家的难题。今天&#xff0c;我们就来…

比较器 XD393 XINLUDA(信路达) DIP-8 2.5mA 模拟比较器 双路差动

XD393是一款比较器集成电路&#xff0c;适用于各种电子设备中的信号比较和处理。它的应用领域可能包括但不限于以下几个方面&#xff1a; 1. 电源管理&#xff1a;在电源管理系统中&#xff0c;XD393可以用来监控电压水平&#xff0c;确保系统稳定运行&#xff0c;或者触发某…

振动分析-2-信号频域分析以及频率分辨率的理解

参考2023-11-26 什么是频率&#xff1f; 参考2016-10-31什么是固有频率&#xff1f; 参考2024-01-28什么是频率分辨率&#xff1f; 参考2024-01-07香农采样定理有两种描述&#xff0c;哪个正确&#xff1f; 1 什么是频率 1.1 频率的定义 我们把振动发生完成一个完整往复循环…

利用 AI 深度学习,实现化合物配比最优化解决方案

为什么需要化合物配比的优化&#xff1f; 在化合物制造行业中&#xff0c;化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前&#xff0c;这一过程高度依赖于材料专家和工程技术人员的经验&#xff0c;通过反复试验来验证产品性能&#xff0c;确保其满足市场和客户的…

Redis实现分布式锁有哪些方案?

Redis实现分布式锁有哪些方案&#xff1f; 在这里分享六种Redis分布式锁的正确使用方式&#xff0c;由易到难。 本文已收录到Java面试网站 方案一&#xff1a;SETNXEXPIRE 方案二&#xff1a;SETNXvalue值(系统时间过期时间) 方案三&#xff1a;使用Lua脚本(包含SETNXEXPIRE…

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第332p-第p335的内容 熔断降级 开启对Feign远程服务的熔断保护机制 feign.sentinel.enabletrue 这里我们只是调用方加就行 被调用方不用加 正常…

【Ai】使用LabelStudio做数据标注

一、什么是LabelStudio LabelStudio是一个功能丰富、灵活便捷、易于使用的数据标注工具&#xff0c;适用于各种机器学习和深度学习项目中的数据标注工作。有特点如下&#xff1a; 多功能性&#xff1a;LabelStudio支持为多种数据类型创建自定义标注界面&#xff0c;包括图像、…

【会议征稿,五大海内外高校支持】第四届经济发展与商业文化国际学术会议(ICEDBC2024,6月21-23)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在中国大连隆重召开。会议主要围绕“经济发展”“商业文化”等研究领域展开讨论。 旨在为经济&#xff0c;商业的专家学者及企业发展人提供一个分享研究成果、讨论存在的问题与挑战…

富瀚微FH8322 ISP图像调试—BLC校正

1、简单介绍 目录 1、简单介绍 2、调试方法 3、输出结果 富瀚微平台调试有一段时间了&#xff0c;一直没有总结&#xff0c;我们调试ISP的时候&#xff0c;首先一步时确定好sensor的黑电平值&#xff0c;黑电平如果不准&#xff0c;则会影响到后面的颜色及对比度相关模块。…

AI预测福彩3D采取888=3策略+和值012路或双胆下一测试6月11日新模型预测第1弹

很抱歉各位小伙伴&#xff0c;端午节三天去了趟外地&#xff0c;没有按时更新3D和排三的预测。前面跟大家说过&#xff0c;8码定位是关键&#xff0c;8码定位能稳定在80%的命中率&#xff0c;才有望通过缩号缩至200-250注以内通过等额方式进行投资。由于前面的模型对8码定位的效…

MONA来了 小鹏子品牌首车定名M03,20万内空间智能颜值都要能打

作者 |苗岭 编辑 |德新 小鹏汽车今日公布&#xff0c;MONA系列的第一款车正式命名为&#xff0c;小鹏M03。 9个月前&#xff0c;小鹏汽车从滴滴手中收购了代号为「达芬奇」的造车项目。 5月21日&#xff0c;何小鹏在小鹏汽车的第一季度财报会议上宣布&#xff0c;MONA系列的…

超详解——Python 编程中的类型和对象深入探讨——基础篇

目录 1. 内建类型的布尔值 1.1 布尔值的基本规则 1.2 进阶应用 2. 对象身份的比较 2.1 基本概念 2.2 示例代码 2.3 实际应用 3. 对象类型比较 3.1 基本概念 3.2 示例代码 3.3 实际应用 4. 类型工厂函数 4.1 常见的类型工厂函数 4.2 示例代码 4.3 实际应用 5. P…

【推荐收藏】2024年5款最佳 GPU 渲染引擎大盘点

2024年已经过半&#xff0c;对于从事3D渲染和数字内容创作的朋友来说&#xff0c;选择一款高效的GPU渲染引擎至关重要。今天&#xff0c;小编就来为大家盘点一下2024年5款最佳GPU渲染引擎。 1.V-Ray V-Ray是一款备受欢迎的3D GPU渲染引擎&#xff0c;被建筑、视觉特效、室内设…

阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的

dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具&#xff0c;可以帮助企业或者个人实现多数据源的切换&#xff0c;这里通过阅读源码的方式解析是如何动态的切换数据源的&#xff0c;采用的版本是3.5.1 源码解析 通过官方文档可以看到&#x…

leetcode 所有可能的路径(图的遍历:深度优先和广度优先)

leetcode 链接&#xff1a; 所有可能的路径 1 图的基本概念 1.1 有向图和无向图 左边是有向图&#xff0c;右边是无向图。对于无向图来说&#xff0c;图中的边没有方向&#xff0c;两个节点之间只可能存在一条边&#xff0c;比如 0 和 1 之间的边&#xff0c;因为是无向图&am…

抖音 根据sec uid获取个人详细信息(性别、年龄、属地、关注数、粉丝数、简介等)

本文带来用户的secuid获取用户信息以及其他基本信息&#xff1a; 话不多说看效果&#xff1a; 第一步输入用户sec_uid 根据secuid获取到用户基本信息&#xff1a; 可以支持接口批量转换&#xff0c;欢迎咨询

从数据采集到部署,手把手带你训练一个高质量的图像分类模型

本文来自社区投稿&#xff0c;作者李剑锋 MMPreTrain 是一款基于 PyTorch 的开源深度学习预训练工具箱&#xff0c;本文将从数据采集到部署&#xff0c;手把手带大家使用 MMPreTrain 算法库训练一个高质量的图像分类模型。 MMPreTrain 项目链接&#xff1a; https://github.co…

正则表达式(Linux 下搭配 grep 使用)

目录 1.基本正则表达式 2.扩展正则表达式 3.实操之grep筛选 3.1基本正则表达式 3.2扩展正则表达式 1.基本正则表达式 ^ 用于最左端,如^"abc",匹配以abc开头的行 $ 用于最右端,如"abc$",匹配以abc结尾的行 ^$ …

使用Oracle VM VirtualBox安装Centos7

下载软件 VirtualBox下载&#xff1a; https://www.virtualbox.org/ CentOS7下载&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64/(阿里云镜像下载快) VirtualBox下载好之后&#xff0c;双击运行后&#xff0c;根据提示直接下一步到底就行了。 下面开始安装cent…

接连获得2项认可!细探美创信创数据安全方案与实践

信创浪潮奔涌向前&#xff0c;筑信创防线&#xff0c;守数据安全&#xff0c;近年来&#xff0c;美创科技率先布局&#xff0c;持续在信创产品类型、产品更新迭代、国产信创改造服务、解决方案、生态建设等方面创新与实践&#xff0c;以满足各行业用户数据安全建设需求&#xf…