springboot异步线程池

springboot异步线程池_第1张图片

项目中经常会遇到线程池异步处理一些任务

1.配置信息

# 异步线程配置
# 核心线程数
async:
  executor:
     thread:
       core_pool_size: 10
  # 最大线程数
       max_pool_size: 100
  # 任务队列大小
       queue_capacity: 20
  # 线程池中线程的名称前缀
       name:
         prefix: kc-async-service-
  # 缓冲队列中线程的空闲时间
       keep_alive_seconds: 100
       await_termination_seconds: 60

2.公共配置类:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
@ComponentScan("com.gary.kc")
public class AsyncConfig implements AsyncConfigurer {
    @Value("${async.executor.thread.core_pool_size}")
    private int corePoolSize;
    @Value("${async.executor.thread.max_pool_size}")
    private int maxPoolSize;
    @Value("${async.executor.thread.queue_capacity}")
    private int queueCapacity;
    @Value("${async.executor.thread.name.prefix}")
    private String namePrefix;
    @Value("${async.executor.thread.keep_alive_seconds}")
    private int keepAliveSeconds;
    @Value("${async.executor.thread.await_termination_seconds}")
    private int awaitTerminationSeconds;
    @Override
    @Bean("AsyncExecutor")
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        //返回可用处理器的Java虚拟机的数量,可以根据数量设定线程参数,我这里直接写死了
        int i = Runtime.getRuntime().availableProcessors();
        //设置核心线程数
        threadPool.setCorePoolSize(corePoolSize);
        //设置最大线程数
        threadPool.setMaxPoolSize(maxPoolSize);
        //线程池所使用的缓冲队列
        threadPool.setQueueCapacity(queueCapacity);
        //等待任务在关机时完成--表明等待所有线程执行完
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        // 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
        threadPool.setAwaitTerminationSeconds(awaitTerminationSeconds);
        //  线程名称前缀
        threadPool.setThreadNamePrefix(namePrefix);
        // 线程的空闲时间
        threadPool.setKeepAliveSeconds(keepAliveSeconds);
        // 拒绝策略
        threadPool.setRejectedExecutionHandler(new  ThreadPoolExecutor.CallerRunsPolicy());
        // 初始化线程
        threadPool.initialize();
        return threadPool;
    }

}

PS:线程池拒绝策略
 

 rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下

AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。

3.使用线程池

@Async("AsyncExecutor")
public void asyncBatchInsertCallList() {
    try {
        log.warn("start Batch Insert");

    } catch(Exception e){

     log.error("start Batch Insert error:{}",e);

 }

4.总结

多尝试,换个思路可能会更好。 

你可能感兴趣的:(java,开发语言)