1、自定义线程池
@Configuration
public class ThreadPoolConfig {
/**
* 默认线程池
*
* @return Executor
*/
@Bean("defaultThreadPool")
public ThreadPoolTaskExecutor defaultThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor ();
//核心线程数目
executor.setCorePoolSize(16);
//指定最大线程数
executor.setMaxPoolSize(64);
//队列中最大的数目
executor.setQueueCapacity(640);
//线程名称前缀
executor.setThreadNamePrefix("defaultThreadPool-");
//对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程空闲后的最大存活时间
executor.setKeepAliveSeconds(60);
//初始化
executor.initialize();
return executor;
}
}
线程池参数的合理设置可参考这篇文章:
线程池参数的合理设置_通过配置类线程池如何初始化参数配置多少合适_tianjinsong的博客-CSDN博客
2、使用CompletableFuture提交任务,带返回值
//线程池开启线程提交任务执行业务代码
//threadPoolTaskExecutor为自定义线程池Bean对象
CompletableFuture<DeviceAccessTimeEntity> deviceAccessTimeTask = CompletableFuture.supplyAsync(() -> {
//查询业务代码逻辑
DeviceAccessTimeEntity deviceAccessTimeEntity = deviceAccessTimeService.getInfoByMobileDevIdAndTenantId(deviceId, IUserService.getTenantId());
return deviceAccessTimeEntity;
}, threadPoolTaskExecutor);
3、使用CompletableFuture.join()方法获取返回结果
//获取结果返回值
DeviceAccessTimeEntity deviceAccessTimeEntity = deviceAccessTimeTask.join();
补充:CompletableFuture.get()和CompletableFuture.join()的区别
相同:都是用来获取CompletableFuture异步之后的返回值
不同:(1) get()方法遇到异常的代码时不会主动抛出,需要try catch手动捕获异常
(2) join()会将异常包装成CompletionException异常 /CancellationException异常
4、结束,这是开启一个线程的查询,如果业务查询多个数据库可开启多个线程