ThreadPoolTaskExecutor配置

一.項目中線程池的使用:java

    參數配置:(application.yml配置文件中)  spring

task:
    pool:
      corePoolSize: 10
      maxPoolSize: 50
      keepAliveSeconds: 300
      queueCapacity: 1000

    經過註解app

@Component
@ConfigurationProperties(prefix = "spring.task.pool")

獲取配置文件的參數設置:線程

    線程池配置:code

@EnableAsync
@Configuration
public class ThreadPoolConfig {

	@Autowired
	private ThreadPoolProperties poolConfig;
	
	//定義線程池(同理可拓展)
	@Bean  
    public Executor testTaskAsyncPool() {  
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  
        executor.setCorePoolSize(poolConfig.getCorePoolSize());  
        executor.setMaxPoolSize(poolConfig.getMaxPoolSize());  
        executor.setQueueCapacity(poolConfig.getQueueCapacity());  
        executor.setKeepAliveSeconds(poolConfig.getKeepAliveSeconds());  
        executor.setThreadNamePrefix("testExecutor-");  
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());  
        executor.initialize();  
        return executor;  
    }  
}

    參數說明:接口

    corePoolSize:核心線程數---10隊列

            a.核心線程會一直存活,即便沒有任務執行也存活ci

            b.當線程數少於核心線程數時,即便有空閒的線程,也會優先建立新的線程去處理。get

            c.設置參數allowCoreThreadTimeout=true(默認false),核心線程會超時關閉。it

    queueCapacity:任務隊列容量(阻塞隊列)---1000

            a.當核心線程數達到最大時,新任務會放在隊列中排隊等待執行。

    maxPoolSize:最大線程數---50

            a.當線程數大於corePoolSize時,且任務隊列也已滿,線程池會建立新的線程處理任務。

            b.當線程數=maxPoolSize,且任務隊列已滿,線程池會默認拋出異常拒絕執行任務。

    keepAliveSeconds:線程空閒時間---300

            a.當線程空閒時間達到這個設置時間時,線程會自動退出,直到線程數量=corePoolSize

            b.若是allowCoreThreadTimeout=true,則會直到線程數量=0

    rejectedExecutionHandler:任務拒絕處理器

            a.兩種狀況會拒絕處理任務

                1st.當線程數量已經達到maxPoolSize,且隊列已滿,就會拒絕新任務

              2nd.當線程池被調用shutdown後,會等線程池裏任務執行完畢,再shutdown,若是在調用shutdown和線程池真正shutdown之間提交任務,會拒絕新任務。

            b.線程池會調用rejectedExecutionHandler來處理任務,默認是AbortPolicy,拋出異常

            c.ThreadPoolExecutor內部實現的方式:

                    c1.AbortPolicy  丟棄任務,拋運行時異常

                    c2.CallerRunsPolicy 執行任務

                    c3.DiscardPolicy 忽視,什麼都不會發生

                    c4.DiscardOldestPolicy 從隊列中踢出最早進入隊列(最後一個執行)的任務

            d.也可實現RejectedExecutionHandler接口,自定義處理器

 

 

ThreadPoolExecutor執行順序:

1.當線程數小於核心線程數時,建立新線程

2.當線程數大於等於核心線程數時,且任務隊列未滿時,將任務放入任務隊列

3.當線程數大於核心線程數,且任務隊列已滿時,

        a.若線程數少於最大線程數,建立線程

        b.若線程數等於最大線程數,拋出異常,拒絕任務

 

二.線程池的使用:

    經過註解的方式使用,在方法上添加註解

   @Async("testTaskAsyncPool")

    可在業務代碼的方法上直接調用便可。。。

相關文章
相關標籤/搜索