spring boot自定義線程池以及異步處理@Async:
什么是線程池?
線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后台線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,並處於多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。
什么是異步處理?
一個可以無需等待被調用函數的返回值就讓操作繼續進行的方法
思路
使用@Async來標記異步方法
實現
1.創建ThreadPoolConfig類,注意,需標記@EnableAsync
@Configuration
@EnableAsync
public class ThreadPoolConfig {
//其他
}
2.定義defaultThreadPool
@Bean
public Executor defaultThreadPool() {
ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
executor.setPoolSize(線程大小);
executor.setThreadPriority(優先級);
executor.setThreadNamePrefix(名稱前綴);
executor.initialize();
return executor;
}
3.編寫異步測試方法,注意,需標記@Async
@Async
public Future<String> async() throws InterruptedException {
final long time = 5000;
Thread.sleep(time);
LOGGER.info("async exec");
return new AsyncResult<>("job done");
}
4.調用異步方法(如無需獲取返回值的話,可直接調用),這里的樣例是等待異步方法執行,然后獲得返回值的場景
public String asyncWait() throws InterruptedException, ExecutionException {
Future<String> msg = demoService.async();
final long time = 10000;
while (true) {
if (msg.isDone()) {
break;
}
Thread.sleep(time);
}
return msg.get();
}