Springboot中线程池的使用与应用
1、线程池的类型
1:Executors.newSingleThreadExecutor()
corePoolSize和maximumPoolSize都为1,也就是创建了一个固定大小是1的线程池,workQueue是new LinkedBlockingQueue < Runnable >()是一种无界阻塞队列,队列的大小是Integer.MAX_VALUE,可以认为是队列的大小不限制。
由此可以得出通过该方法创建的线程池,每次只能同时运行一个线程,当有多个任务同时提交时,那也要一个一个排队执行
2:Executors.newFixedThreadPool(int nThreads)
创建了一个固定大小的线程池,可以指定同时运行的线程数量为nThreads。
3:Executors.newCachedThreadPool()
构造一个缓冲功能的线程池,配置corePoolSize=0,maximumPoolSize=Integer.MAX_VALUE,keepAliveTime=60s,以及一个无容量的阻塞队列 SynchronousQueue,因此任务提交之后,将会创建新的线程执行;线程空闲超过60s将会销毁
4:Executors.newScheduledThreadPool(int corePoolSize)
构造有定时功能的线程池,配置corePoolSize,无界延迟阻塞队列DelayedWorkQueue;maximumPoolSize=Integer.MAX_VALUE,由于DelayedWorkQueue是无界队列,所以这个值是没有意义的
2、TaskExecutor接口的实现类简要说明
1:SimpleAsyncTaskExecutor类 :这个实现不重用任何线程,或者说它每次调用都启动一个新线程,性能消耗比较严重。
2:ConcurrentTaskExecutor 类 :Spring 2.x借助ConcurrentTaskExecutor和ThreadPoolTaskExecutor能够通过IoC配置形式自定义它们暴露的各个属性。很少需要使用ConcurrentTaskExecutor,有另一个备选, ThreadPoolTaskExecutor类
3:ThreadPoolTaskExecutor 类 :ThreadPoolTaskExecutor内部对ThreadPoolExecutor进行了包装,同时提供能够通过IOC的形式来配置线程池的各个参数,比较常用
4:ThreadPoolTaskScheduler类 :ThreadPoolTaskScheduler内部对ScheduledThreadPoolExecutor进行了包装,除了能执行异步任务外支持定时/延迟任务的执行,属于一种高级特性
3、自定义ThreadPoolTaskExecutor
1)配置
@Configuration
@Bean
public ThreadPoolTaskExecutor mythreadpool(){
ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
//设置核心线程数
threadPool.setCorePoolSize(5);
//设置最大线程数
threadPool.setMaxPoolSize(100);
//设置线程超时等待时间
threadPool.setKeepAliveSeconds(60);
//设置任务等待队列的大小
threadPool.setQueueCapacity(100);
//设置线程池内线程的名称前缀---阿里编码规约推荐----出错了方便调试
threadPool.setThreadNamePrefix("myThreadPool-");
//设置任务拒绝策略
threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
//直接初始化
threadPool.initialize();
return threadPool;
}
2)使用
// @Autowired
@Resource(name = "mythreadpool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;