异步线程池ThreadPoolTaskExecutor + springboot配置

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多线程注解使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值