SpringBoot配置ThreadPoolTaskExecutor

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

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

/**
 * 1. 當一個任務被提交到線程池時,首先查看線程池的核心線程是否都在執行任務,否就選擇一條線程執行任務,是就執行第二步。
 * 2. 查看核心線程池是否已滿,不滿就建立一條線程執行任務,不然執行第三步。
 * 3. 查看任務隊列是否已滿,不滿就將任務存儲在任務隊列中(SynchronousQueue同步隊直接執行第四步),不然執行第四步。
 * 4. 查看線程池是否已滿,不滿就建立一條線程執行任務,不然就按照策略處理沒法執行的任務。
 */
@Configuration
public class ThreadPoolTaskConfig {

    @Bean
    public Executor executor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //此方法返回可用處理器的虛擬機的最大數量; 不小於1
        int core = Runtime.getRuntime().availableProcessors();
        executor.setCorePoolSize(core);//設置核心線程數
        executor.setMaxPoolSize(core*2 + 1);//設置最大線程數
        executor.setKeepAliveSeconds(3);//除核心線程外的線程存活時間
        executor.setQueueCapacity(40);//若是傳入值大於0,底層隊列使用的是LinkedBlockingQueue,不然默認使用SynchronousQueue
        executor.setThreadNamePrefix("thread-execute");//線程名稱前綴
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//設置拒絕策略
        return executor;
    }
}

如上述代碼已經配置好ThreadPoolTaskExecutor,在spring容器啓動的時候會被初始化成bean存放在上下文中。須要使用的話只須要@autowired注入便可。
ThreadPoolTaskExecutor底層調用的就是ThreadPoolExecuter,關於Lee老爺子的線程池原理能夠參考以前的一篇博文
https://blog.csdn.net/weixin_43142697/article/details/82875437

java

相關文章
相關標籤/搜索