ThreadPoolTaskExecutor
ThreadPoolTaskExecutor
这个类则是spring包下的,是sring为我们提供的线程池类
线程池配置
通过配置类的方式配置线程池,然后注入。
@Configuration //声明配置类
@EnableAsync //开启异步
public class ExecturConfig {
@Bean("taskExector")
public ThreadPoolTaskExecutor taskExector() {
//设置固定大小
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
Executor executorService = Executors.newCachedThreadPool();
executor.setCorePoolSize(3);//核心线程数
executor.setMaxPoolSize(80);//最大线程数
executor.setQueueCapacity(300);//队列长度
executor.setKeepAliveSeconds(100);//线程空闲时间
executor.setThreadNamePrefix("thread-pool-spring");//线程名称
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//拒绝策略
return executor;
//使用CUP核心数为线程池大小
/*int threadSum = Runtime.getRuntime().availableProcessors();//获取到服务器的cpu内核
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(threadSum);//核心线程数
executor.setMaxPoolSize(100);//最大线程数
executor.setQueueCapacity(300);//队列长度
executor.setKeepAliveSeconds(100);//线程空闲时间
executor.setThreadNamePrefix("thread-pool-spring");//线程名称
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//拒绝策略
return executor;*/
}
}
rejectedExectutionHandler参数用于配置绝策略,常用拒绝策略如下
AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧(最先)的未处理请求,然后重试execute。
DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
处理流程
1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否则就选择一条核心线程执行任务,无空闲核心线程的话就执行第2步。
2.查看核心线程池是否已满,不满就创建一条核心线程执行任务,否则执行第3步。
3.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第4步。
4.查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略处理执行。
Demo
创建调用多线程Test方法
@Autowired
private Asyncs asyncs;
@Test
public void gets() throws Exception {
for (int i=0;i<=20;i++){
asyncs.doTaskThree(i);
}
}
//此处需要与Thread配置类声明@Bean("taskExector")保持一致
@Async(("taskExector"))
public void doTaskThree(Integer i) throws Exception {
System.out.println(Thread.currentThread().getName() + "开始做任务" + i);
long start = System.currentTimeMillis();
Thread.sleep(100);
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "完成任务"+ i +",耗时:" + (end - start) + "毫秒");
}
参考来源:
原文链接: ThreadPoolTaskExecutor和ThreadPoolExecutor区别.
原文链接: springboot中@Async多线程注解使用.