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);
}
}
}