配置线程池的作用及优点:

1:创建线程和销毁线程的过程是一个极度消耗内存的一个操作,那么整合了线程池就可以对其进行优化。

2:线程池可以提供定时、定期、单线程、并发数控制等功能。可以发起N秒以后执行的任务。

3:不会影响主线程的操作。可以优化一些操作的执行速度。


准备工作:

创建了一个boot基本项目写了一个简单查询。 

 

 

 2.在这个服务方法里面写一个延迟方法。

 public void Ther(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
        }

        System.out.println("延迟中。。。");
    }

 这样在list方法调用那么那个访问那个接口就会产生延迟。

 

 

 这样就影响到了主业务的速度。那么我们将他转换成一个线程池的方式,开放一个子线程执行那个延迟,就不会影响到我的主业务。我们也可以将一些影响主业务速度的子业务放在里面提高执行速度。那么我们开始改造。


 线程池改造:

创建一个配置类

 

//开启多线程
@Configuration
@EnableAsync
public class Thr {


    /**
     * 核心线程数
     * 默认的核心线程数为1
     *
     */
    private static final int CORE_POOL_SIZE = 5;
    /**
     * 最大线程数
     * 默认的最大线程数是Integer.MAX_VALUE 即2<sup>31</sup>-1
     */
    private static final int MAX_POOL_SIZE = 50;
    /**
     * 缓冲队列数
     * 默认的缓冲队列数是Integer.MAX_VALUE 即2<sup>31</sup>-1
     */
    private static final int QUEUE_CAPACITY = 100;

    /**
     * 允许线程空闲时间
     * 默认的线程空闲时间为60秒
     */
    private static final int KEEP_ALIVE_SECONDS = 30;

    /**
     * 线程池前缀名
     */
    private static final String THREAD_NAME_PREFIX = "Task_Service_Async_";

    /**
     * allowCoreThreadTimeOut为true则线程池数量最后销毁到0个
     * allowCoreThreadTimeOut为false
     * 销毁机制:超过核心线程数时,而且(超过最大值或者timeout过),就会销毁。
     * 默认是false
     */
    private boolean allowCoreThreadTimeOut = false;

    @Bean("taskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {

        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        taskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        taskExecutor.setQueueCapacity(QUEUE_CAPACITY);
        taskExecutor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS);
        taskExecutor.setThreadNamePrefix(THREAD_NAME_PREFIX);
        taskExecutor.setAllowCoreThreadTimeOut(allowCoreThreadTimeOut);
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //线程池初始化
        taskExecutor.initialize();
        return taskExecutor;
    }


}

 接下来就简单了:

在你想要在子线程执行的方法上面添加一条代码。

 

 

 在去运行代码

 

 这样线程池配置就结束了。

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐