1、使用线程工厂创建
public static ExecutorService newCachedThreadPool() {
// 使用 ThreadFactoryBuilder 创建自定义线程名称的 ThreadFactory
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("audit-update-pool-%d").build();
// 创建线程池,其中任务队列需要结合实际情况设置合理的容量
ThreadPoolExecutor executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().availableProcessors(),
1,
TimeUnit.MINUTES,
new LinkedBlockingQueue<>(1024),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy());
return executor;
}
}
//使用
private static ExecutorService executorService = ThreadPoolUtil.newCachedThreadPool();
executorService.submit(new UpdateAuditTask(orderCode, sopPurchaseOrderDAO,merchantUserMapper,
flowInstanceSDKService, ticketNo, initiationPlaceDiamond.getPurchaseFlowId()));
2、注入bean的方式
@Configuration
@EnableAsync
@Slf4j
public class ExecutorConfig {
@Bean
public Executor asyncServiceExecutor() {
log.info("初始化线程池");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(10);
//配置队列大小
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-tms");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
@Bean("asyncNBFServiceExecutor")
public Executor asyncNBFServiceExecutor() {
log.info("nbf初始化线程池");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(10);
//配置队列大小
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-nbf-tms");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// DiscardPolicy:当线程池添加失败,则放弃不处理
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
使用
@Resource
private Executor asyncServiceExecutor;
//异步触发一次
RpcContext_inner rpcContext = EagleEye.getRpcContext();
asyncServiceExecutor.execute(() -> {
try {
EagleEye.setRpcContext(rpcContext);
autoDeliveryByNumTask.perform(taskDTO);
} catch (Throwable e1) {
log.error("autoDeliveryByNumTask fail", e1);
} finally {
EagleEye.clearRpcContext();
}
});