ThreadPoolTaskExecutor使用

本文介绍了Spring框架中的ThreadPoolTaskExecutor和ThreadPoolTaskScheduler的区别,前者用于执行任务,提供了细粒度配置,后者用于任务调度。作者通过代码示例展示了如何在不同场景下选择和配置这两个类。
摘要由CSDN通过智能技术生成

1、背景

spring的org.springframework.scheduling.concurrent包下有一个ThreadPoolTaskExecutor类,今天这里讨论一下该类的使用。

2、理解

  • ThreadPoolTaskExecutor是一个专门用于执行任务的类。
  • 与之相关的ThreadPoolTaskScheduler是一个专门用于调度任务的类。
ThreadPoolTaskExecutor通过它的corePoolSize , maxPoolSize , keepAliveSeconds和queueCapacity属性在线程池中提供细粒度的配置。

ThreadPoolTaskScheduler这样的调度器不提供这样的配置。
因此,在两者之间进行选择归结为以下问题:是否需要执行或计划执行任务?根据不同的用途去选择。

3、代码示例

package com.mcode.scheduled.spring.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author: xie
 * @date: 2021-11-01
 **/
@Configuration
public class ExecutorConfig {

    /***
     * 注意事项: ThreadPoolTaskExecutor 和 ThreadPoolTaskScheduler的区别
     *
     * 1、ThreadPoolTaskExecutor是一个专门用于执行任务的类。
     * 2、ThreadPoolTaskScheduler是一个专门用于调度任务的类。
     *
     * ThreadPoolTaskExecutor通过它的corePoolSize , maxPoolSize , keepAliveSeconds和queueCapacity属性在线程池中提供细粒度的配置。
     * ThreadPoolTaskScheduler这样的调度器不提供这样的配置。
     * 因此,在两者之间进行选择归结为以下问题:是否需要执行或计划执行任务?根据不同的用途去选择。
     *
     * 参考博文: https://blog.csdn.net/andybegin/article/details/110002100?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1
     *
     * @return
     */

    @Bean
    public ThreadPoolTaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数
        executor.setCorePoolSize(4);
        // 最大线程数
        executor.setMaxPoolSize(5);
        // 任务队列大小
        executor.setQueueCapacity(25);
        // 线程前缀名
        executor.setThreadNamePrefix("mcode");
        // 线程的空闲时间
        executor.setKeepAliveSeconds(200);
        // 拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 线程初始化
        executor.initialize();

        return executor;
    }
}
package com.mcode.scheduled.spring.scheduled;

import com.mcode.scheduled.spring.service.ScanDMailThread;
import com.mcode.scheduled.spring.service.SpringContextHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

/**
 * @author: xie
 * @date: 2021-11-01
 **/
@Service
public class ScanDMailAndSendMsgTask {

    @Autowired
    private SpringContextHelper helper;

    private static int NUMBER = 2000;

    @Scheduled(cron = "*/2 * * * * ?")
    public void initScan(){
        ThreadPoolTaskExecutor taskExecutor=(ThreadPoolTaskExecutor)helper.getBean("taskExecutor");
        for(int k = 0; k < NUMBER; k++) {
            ScanDMailThread scanDMailThread=new ScanDMailThread();
            //将参数分配至线程,测试采用最简单的方式,大家发挥想象。
            scanDMailThread.setName(" 发送邮件 --->>>>> "+ k );
            taskExecutor.execute(scanDMailThread);
        }

    }
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mercury_@22

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值