在开发中有时需要线程池,系统默认的线程池使用不当会出现的性能问题,所以很多时候有用户自己定义需要的线程池,下面是定义线程池的代码:
1,线程池定义
package com.xxx.yyy.kkk;
import com.alibaba.ttl.threadpool.TtlExecutors;
import com.springframework.context.annotation.Bean;
import com.springframework.context.annotation.Configuration;
import com.springframework.core.task.AsyncTaskExecutor;
import com.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.*;
@Configuration
public class ThreadPoolConfig {
/**
* 自定义用户线程池,
* 注意:如果线程中业务处理需要用到登录用户信息,
* 该方法可以在异步多线程中共享登录用户信息
*/
@Bean("asyncExecutor01")
public Executor asyncExecutor01(){
ExecutorService executor = Executors.newFixedThreadPool(8);
return TtlExecutors.getTtlExecutorService(executor);
}
/**
* 自定义用户线程池,
* 注意:避免系统默认的线程池出现的性能问题
* 该方法无法在多个异步多线程中共享登录用户信息
*/
@Bean("asyncExecutor02")
public Executor asyncExecutor02() {
ThreadPoolTaskExector executor = new ThreadPoolTaskExector();
//核心线程数
executor.setCorePoolSize(10);
//最大线程数
executor.setMaxPoolSize(20);
//队列中等待处理的最大的数目
executor.setQueueCapacity(200);
//线程空闲后的最大存活时间单位秒
executor.setKeepAliveSeconds(120);
//对拒绝task的处理策略
//rejection-policy:当pool已经达到max size的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExector.CallerRunsPolicy());
//线程名称前缀
executor.setThreadNamePrefix("asyncExecutor02-thread-pool-");
return executor;
}
/**
* 自定义用户线程池,
* 注意:避免系统默认的线程池出现的性能问题
* 该方法无法在多个异步多线程中共享登录用户信息
*/
@Bean("asyncExecutor03")
public AsyncTaskExecutor asyncExecutor03() {
ThreadPoolTaskExector executor = new ThreadPoolTaskExector();
//核心线程数
executor.setCorePoolSize(10);
//最大线程数
executor.setMaxPoolSize(20);
//队列中等待处理的最大的数目
executor.setQueueCapacity(200);
//线程空闲后的最大存活时间单位秒
executor.setKeepAliveSeconds(120);
//对拒绝task的处理策略
//rejection-policy:当pool已经达到max size的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExector.AbortPolicy());
//线程名称前缀
executor.setThreadNamePrefix("asyncExecutor03-thread-pool-");
return executor;
}
}
2,线程池使用时
// 在其它Service中使用为
@Autowire
private Executor asyncExecutor01;
String param01 = "...";
int param02 = "...";
CompletableFuture.supplyAsync((param01, param02) -> {
try {
String msg = xxService.fun01(param01, param02);
return msg;
} catch(Exception e){
throw e;
} finally{
// 最后执行
// todo...
}
},asyncExecutor01);
//... 其它代码省略...