您好,登錄后才能下訂單哦!
Springboot中異步線程池怎么配置,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
首先我們需要先編寫 啟用@EnableAsync 的線程池配置類
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
//啟動異步
@EnableAsync
//這是一個配置類
@Configuration
class TaskPoolConfig {
//設置Bean的名稱不設置的話沒有辦法在 任務中對應 配置信息
@Bean("taskExecutor")
public Executor taskExecutor() {
//根據ThreadPoolTaskExecutor 創建建線程池
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//為線程設置初始的線程數量 5條線程
executor.setCorePoolSize(5);
//為線程設置最大的線程數量 10條線程
executor.setMaxPoolSize(10);
//為任務隊列設置最大 任務數量
executor.setQueueCapacity(200);
//設置 超出初始化線程的 存在時間為60秒
//也就是 如果現有線程數超過5 則會對超出的空閑線程 設置摧毀時間 也就是60秒
executor.setKeepAliveSeconds(60);
//設置 線程前綴
executor.setThreadNamePrefix("taskExecutor-");
//線程池的飽和策略 我這里設置的是 CallerRunsPolicy 也就是由用調用者所在的線程來執行任務 共有四種
//AbortPolicy:直接拋出異常,這是默認策略;
//CallerRunsPolicy:用調用者所在的線程來執行任務;
//DiscardOldestPolicy:丟棄阻塞隊列中靠最前的任務,并執行當前任務;
//DiscardPolicy:直接丟棄任務;
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//設置在關閉線程池時是否等待任務完成
executor.setWaitForTasksToCompleteOnShutdown(true);
//設置等待終止的秒數
executor.setAwaitTerminationSeconds(60);
//返回設置完成的線程池
return executor;
}
}
在使用線程池的時候我們需在使用線程池的任務方法上面加上@Async注解
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
//啟用log 在控制臺輸出信息
@Slf4j
//啟用@Component 注解將該類注入到spring容器中
@Component
public class test {
//為Hello類方法設置異步調用的配置類
@Async("taskExecutor")
public void Hello(String hello) throws InterruptedException {
//開始執行任務
log.info("任務開始并延長執行時間");
//延遲執行
Thread.sleep(1000);
//執行輸出
log.info(hello);
}
}
編寫測試線程池的方法這利用的idea 的單元測試
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
//自動裝配 線程測試類
@Autowired
private test test;
@Test
public void test() throws Exception {
//循環跑30個任務
for (int i = 0;i<30;i++){
test.Hello("test"+i);
}
}
}
這里需要說一下Spring有自己的線程池 我的這個屬于自定義的線程池
同時Spring提供了定時任務調度的注解非常強大 @Scheduled+Cron配置
同時這個定時任務不與線程池發生沖突
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。