咱們在實際項目中有些複雜運算、耗時操做,就能夠利用多線程來充分利用CPU,提升系統吞吐量。SpringBoot對多線程支持很是好,對咱們的開發很是便捷。java
Future模式是多線程開發中很是常見的一種設計模式。核心思想是異步調用。當咱們執行一個方法時,方法中有多個耗時任務須要同時去作,並且又不着急等待這個結果時可讓客戶端當即返回而後,後臺慢慢去計算任務。git
當咱們作一件事的時候須要等待,那麼咱們就能夠在這個等待時間內來去作其它事情,這樣就能夠充分利用時間。好比咱們點外賣,須要一段時間,那麼咱們在等外賣的時間裏能夠看點書,看個電影。這就是典型的Future模式。若是是普通模式的話,就是等外賣的時候就等外賣,外賣到了後再去看書,極大的浪費時間。github
SpringBoot對Future模式支持很是好,只須要簡單的代碼就能實現。spring
springboot 配置多線程須要兩個註解設計模式
@EnableAsyncspringboot
在配置類中經過加@EnableAsync開啓對異步任務的支持多線程
@Async異步
在須要執行的方法上加@Async代表該方法是個異步方法,若是加在類級別上,則代表類全部的方法都是異步方法ide
@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()); } }
【注】這裏的方法自動被注入使用上文配置的ThreadPoolTaskExecutor測試
@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模式的好處,在等待時間內去執行其它任務,可以充分利用時間
【注】本文基於SpringBoot 2.0
<br>