SpringBoot2线程池定义使用方法解析
我们都知道spring只是为我们简单的处理线程池,每次用到线程总会new一个新的线程,效率不高,所以我们需要自定义一个线程池。
定义线程池
@Slf4j
@EnableAsync
@Configuration
publicclassAsyncExecutorConfigimplementsAsyncConfigurer{
@Bean
publicThreadPoolTaskExecutorasyncServiceExecutor(){
//返回可用处理器的虚拟机的最大数量不小于1
intcpu=Runtime.getRuntime().availableProcessors();
log.info("startasyncServiceExecutorcpu:{}",cpu);
ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(cpu);
//配置最大线程数
executor.setMaxPoolSize(cpu);
//配置队列大小
executor.setQueueCapacity(50);
//用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
executor.setWaitForTasksToCompleteOnShutdown(true);
//设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
executor.setAwaitTerminationSeconds(60);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
//rejection-policy:当pool已经达到maxsize的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
//使用预定义的异常处理类
executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
returnexecutor;
}
@Override
publicExecutorgetAsyncExecutor(){
returnasyncServiceExecutor();
}
@Override
publicAsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler(){
return(throwable,method,objects)->{
StringBuildersb=newStringBuilder();
for(Objectparam:objects){
sb.append(param).append(",");
}
log.error("Exceptionmessage-{},Methodname-{},Parametervalue-{}",throwable.getMessage(),method.getName(),sb.toString());
};
}
}
如何使用
@Autowired
privateThreadPoolTaskExecutorthreadPoolTaskExecutor;
publicvoidtest(){
CompletableFutureuserFuture=CompletableFuture.runAsync(()->System.out.println(111),threadPoolTaskExecutor);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。