异步线程池的使用
1.配置异步线程池
@Configuration
@EnableAsync
public class ExecutorConfig {
/**
* 全文检索数据查询线程池
* @return
*/
@Bean("termDbInterrogatorExecutor")
public Executor termDbInterrogatorExecutor() {
//获取当前机器的核数
int cpuNum = Runtime.getRuntime().availableProcessors();
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(cpuNum);
//配置最大线程数
executor.setMaxPoolSize(cpuNum * 2);
//配置队列大小
executor.setQueueCapacity(100);
//线程存活时间
executor.setKeepAliveSeconds(60);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("termDbInterrogatorThread");
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
2.在服务中注入线程池
@Resource(name = "termDbInterrogatorExecutor")
private Executor termDbInterrogatorExecutor;
3.在方法中使用线程池,特别是用CompletableFuture实现异步编程配置异步任务时使用
return CompletableFuture.supplyAsync(() -> {
TermRespond term = new TermRespond();
term.setModule(termType.getType());
term.setTitle(termType.getName());
term.setData(dbInterrogator.query(key, limit));
return CollectionUtils.isEmpty(term.getData()) ? null : term;
}, termDbInterrogatorExecutor).handle(new BiFunction<TermRespond, Throwable, TermRespond>() {
@Override
public TermRespond apply(TermRespond termRespond, Throwable throwable) {
if (termRespond != null) {
termRespondList.add(termRespond);
}
return termRespond;
}
});