/**
* @Description: 线程池配置 spring内置 TaskExecutor
*/
@Configuration
@EnableAsync
public class ThreadPoolConfig{
/**
* 打印日志
*/
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* cpu 核心数量
*/
public static final int cpuNum = Runtime.getRuntime().availableProcessors();
/**
* 线程池配置
*
* @return
*/
@Bean("taskExecutor")
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 配置核心线程池数量
taskExecutor.setCorePoolSize(cpuNum);
// 配置最大线程池数量
taskExecutor.setMaxPoolSize(cpuNum * 2);
/// 线程池所使用的缓冲队列
taskExecutor.setQueueCapacity(2);
// 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
taskExecutor.setAwaitTerminationSeconds(60);
// 空闲线程存活时间
taskExecutor.setKeepAliveSeconds(60);
// 等待任务在关机时完成--表明等待所有线程执行完
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
// 线程池名称前缀
taskExecutor.setThreadNamePrefix("thread-pool-");
// 线程池拒绝策略
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
// 线程池初始化
taskExecutor.initialize();
logger.info("线程池初始化......");
return taskExecutor;
}
}
1、调用方式一
@Async("taskExecutor") // 对应线程池里的bean
public void doto(InputStream inputStream) {
//todo
}
2、调用方式二 (注入)
@Resource
private TaskExecutor taskExecutor;
3、调用
taskExecutor.execute(() -> this.dotoSomething(int userId));
4、拒绝策略
1.AbortPolicy
中止策略,该策略是默认策略。抛出一个RejectedExecutionException异常
2.DiscardPolicy
抛弃策略,直接丢弃不做任何操作。
3.DiscardOldestPolicy
抛弃旧任务策略,将头任务出队。
4.CallerRunsPolicy
调用者运行。直接调用Runnable的run方法运行