文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用

2023-06-29 07:16

关注

这篇文章主要介绍了Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用文章都会有所收获,下面我们一起来看看吧。

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。

一、ThreadPoolTaskExecutor

本文采用 Executors 的工厂方法进行配置。

1、将线程池用到的参数定义到配置文件中

在项目的 resources 目录下创建 executor.properties 文件,并添加如下配置:

# 异步线程配置# 核心线程数async.executor.thread.core_pool_size=5# 最大线程数async.executor.thread.max_pool_size=8# 任务队列大小async.executor.thread.queue_capacity=2# 线程池中线程的名称前缀async.executor.thread.name.prefix=async-service-# 缓冲队列中线程的空闲时间async.executor.thread.keep_alive_seconds=100

2、Executors 的工厂配置

2.1、配置详情
@Configuration// @PropertySource是找的target目录下classes目录下的文件,resources目录下的文件编译后会生成在classes目录@PropertySource(value = {"classpath:executor.properties"}, ignoreResourceNotFound=false, encoding="UTF-8")@Slf4jpublic class ExecutorConfig {    @Value("${async.executor.thread.core_pool_size}")    private int corePoolSize;    @Value("${async.executor.thread.max_pool_size}")    private int maxPoolSize;    @Value("${async.executor.thread.queue_capacity}")    private int queueCapacity;    @Value("${async.executor.thread.name.prefix}")    private String namePrefix;    @Value("${async.executor.thread.keep_alive_seconds}")    private int keepAliveSeconds;    @Bean(name = "asyncTaskExecutor")    public ThreadPoolTaskExecutor taskExecutor() {        log.info("启动");        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        // 核心线程数        executor.setCorePoolSize(corePoolSize);        // 最大线程数        executor.setMaxPoolSize(maxPoolSize);        // 任务队列大小        executor.setQueueCapacity(queueCapacity);        // 线程前缀名        executor.setThreadNamePrefix(namePrefix);        // 线程的空闲时间        executor.setKeepAliveSeconds(keepAliveSeconds);        // 拒绝策略        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        // 线程初始化        executor.initialize();        return executor;    }}
2.2、注解说明
2.3、线程池配置说明
2.4、线程池配置个人理解

二、异步调用线程

通常 ThreadPoolTaskExecutor 是和 @Async 一起使用。在一个方法上添加 @Async 注解,表明是异步调用方法函数。

@Async 后面加上线程池的方法名或 bean 名称,表明异步线程会加载线程池的配置。

@Component@Slf4jpublic class ThreadTest {        @Async("asyncTaskExecutor")    public void ceshi3() {        for (int i = 0; i <= 10; i  ) {            log.info("ceshi3: "   i);            try {                Thread.sleep(2000 * 5);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

备注:一定要在启动类上添加 @EnableAsync 注解,这样 @Async 注解才会生效。

三、多线程使用场景

1、定时任务 @Scheduled

// 在启动类上添加 @EnableScheduling 注解@SpringBootApplication@EnableSchedulingpublic class SpringBootStudyApplication {   public static void main(String[] args) {      SpringApplication.run(SpringBootStudyApplication.class, args);   }}
// @Component 注解将定时任务类纳入 spring bean 管理。@Componentpublic class listennerTest3 {    @Autowired    private ThreadTest t;        // 每1分钟执行一次ceshi3()方法    @Scheduled(cron = "0 0/1 * * * ?")    public void run() {        t.ceshi3();    }}

ceshi3() 方法调用线程池配置,且异步执行。

@Component@Slf4jpublic class ThreadTest {        @Async("asyncTaskExecutor")    public void ceshi3() {        for (int i = 0; i <= 10; i  ) {            log.info("ceshi3: "   i);            try {                Thread.sleep(2000 * 5);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

2、程序一启动就异步执行多线程

通过继承 CommandLineRunner 类实现。

@Componentpublic class ListennerTest implements CommandLineRunner {    @Autowired    private ThreadTest t;    @Override    public void run(String... args) {        for (int i = 1; i <= 10; i  ) {            t.ceshi();        }    }}
@Component@Slf4jpublic class ThreadTest {    @Async("asyncTaskExecutor")    public void ceshi() {        log.info("ceshi");    }}

3、定义一个 http 接口

还可以通过接口的形式来异步调用多线程:

@RestController@RequestMapping("thread")public class ListennerTest2 {    @Autowired    private ThreadTest t;    @GetMapping("ceshi2")    public void run() {        for (int i = 1; i < 10; i  ) {            t.ceshi2();        }    }}
@Component@Slf4jpublic class ThreadTest {    @Async("asyncTaskExecutor")    public void ceshi2() {        for (int i = 0; i <= 3; i  ) {            log.info("ceshi2");        }    }}

4、测试类

@RunWith(SpringRunner.class)@SpringBootTestpublic class ThreadRunTest {    @Autowired    private ThreadTest t;    @Test    public void thread1() {        for (int i = 1; i <= 10; i  ) {            t.ceshi4();        }    }}
@Component@Slf4jpublic class ThreadTest {    @Async("asyncTaskExecutor")    public void ceshi4() {        log.info("ceshi4");    }}

关于“Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯