咱們在實際項目中有些複雜運算、耗時操做,就能夠利用多線程來充分利用CPU,提升系統吞吐量。SpringBoot對多線程支持很是好,對咱們的開發很是便捷。
Future模式是多線程開發中很是常見的一種設計模式。核心思想是異步調用。當咱們執行一個方法時,方法中有多個耗時任務須要同時去作,並且又不着急等待這個結果時可讓客戶端當即返回而後,後臺慢慢去計算任務。
當咱們作一件事的時候須要等待,那麼咱們就能夠在這個等待時間內來去作其它事情,這樣就能夠充分利用時間。好比咱們點外賣,須要一段時間,那麼咱們在等外賣的時間裏能夠看點書,看個電影。這就是典型的Future模式。若是是普通模式的話,就是等外賣的時候就等外賣,外賣到了後再去看書,極大的浪費時間。
SpringBoot對Future模式支持很是好,只須要簡單的代碼就能實現。java
springboot 配置多線程須要兩個註解git
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//核心線程數
taskExecutor.setCorePoolSize(8);
//最大線程數
taskExecutor.setMaxPoolSize(16);
//隊列大小
taskExecutor.setQueueCapacity(100);
taskExecutor.initialize();
return taskExecutor;
}
}
複製代碼
@Service
public class FutureService {
@Async
public Future<String> futureTest() throws InterruptedException {
System.out.println("任務執行開始,須要:1000ms");
for (int i = 0; i < 10; i++) {
Thread.sleep(100);
System.out.println("do:" + i);
}
System.out.println("完成任務");
return new AsyncResult<>(Thread.currentThread().getName());
}
}
複製代碼
【注】這裏的方法自動被注入使用上文配置的ThreadPoolTaskExecutorgithub
@Resource
private FutureService futureService;
@Test
public void futureTest() throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
System.out.println("開始");
//耗時任務
Future<String> future = futureService.futureTest();
//另一個耗時任務
Thread.sleep(500);
System.out.println("另一個耗時任務,須要500ms");
String s = future.get();
System.out.println("計算結果輸出:" + s);
System.out.println("共耗時:" + (System.currentTimeMillis() - start));
}
複製代碼
開始
2019-01-07 23:50:34.726 INFO 14648 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
任務執行開始,須要:1000ms
do:0
do:1
do:2
do:3
另一個耗時任務,須要500ms
do:4
do:5
do:6
do:7
do:8
do:9
完成任務
計算結果輸出:ThreadPoolTaskExecutor-1
共耗時:1016
Process finished with exit code 0
複製代碼
原本須要至少1500ms 執行的任務如今只須要1016ms, 由於在執行耗時任務1的同時也在執行耗時任務2,兩個任務並行執行,這就是future模式的好處,在等待時間內去執行其它任務,可以充分利用時間spring
【注】本文基於SpringBoot 2.0設計模式
GitHub 鏈接springboot