最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot對Future模式的支持詳解

 更新時間:2019年01月11日 10:14:07   作者:Zejun-Liu  
這篇文章主要給大家介紹了關(guān)于Spring Boot對Future模式的支持的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧

前言

我們在實際項目中有些復(fù)雜運算、耗時操作,就可以利用多線程來充分利用CPU,提高系統(tǒng)吞吐量。SpringBoot對多線程支持非常好,對我們的開發(fā)非常便捷。

Future模式是多線程開發(fā)中非常常見的一種設(shè)計模式。核心思想是異步調(diào)用。當(dāng)我們執(zhí)行一個方法時,方法中有多個耗時任務(wù)需要同時去做,而且又不著急等待這個結(jié)果時可以讓客戶端立即返回然后,后臺慢慢去計算任務(wù)。

當(dāng)我們做一件事的時候需要等待,那么我們就可以在這個等待時間內(nèi)來去做其它事情,這樣就可以充分利用時間。比如我們點外賣,需要一段時間,那么我們在等外賣的時間里可以看點書,看個電影。這就是典型的Future模式。如果是普通模式的話,就是等外賣的時候就等外賣,外賣到了后再去看書,極大的浪費時間。

SpringBoot對Future模式支持非常好,只需要簡單的代碼就能實現(xiàn)。

1.Future的相關(guān)方法

  • boolean cancel(boolean mayInterruptIfRunning);//可以在任務(wù)執(zhí)行過程中取消任務(wù)
  • boolean isCancelled();//判斷Future任務(wù)是否取消
  • boolean isDone();//判斷任務(wù)是否完成
  • V get();//獲取任務(wù)最終結(jié)果,這是一個阻塞方法,會等待任務(wù)執(zhí)行好才會執(zhí)行后面的代碼
  • V get(long timeout, TimeUnit unit);//有等待時常的get方法,等待時間到了后仍然沒有計算完成,則拋異常

2.需要的注解

springboot 配置多線程需要兩個注解

1、@EnableAsync

在配置類中通過加@EnableAsync開啟對異步任務(wù)的支持
2、@Async

在需要執(zhí)行的方法上加@Async表明該方法是個異步方法,如果加在類級別上,則表明類所有的方法都是異步方法

3.配置代碼

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

 @Override
 public Executor getAsyncExecutor() {
 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
 //核心線程數(shù)
 taskExecutor.setCorePoolSize(8);
 //最大線程數(shù)
 taskExecutor.setMaxPoolSize(16);
 //隊列大小
 taskExecutor.setQueueCapacity(100);
 taskExecutor.initialize();
 return taskExecutor;
 }
}

4.FutureService

@Service
public class FutureService {

 @Async
 public Future<String> futureTest() throws InterruptedException {
 System.out.println("任務(wù)執(zhí)行開始,需要:1000ms");
 for (int i = 0; i < 10; i++) {
  Thread.sleep(100);
  System.out.println("do:" + i);
 }
 System.out.println("完成任務(wù)");
 return new AsyncResult<>(Thread.currentThread().getName());
 }
}

【注】這里的方法自動被注入使用上文配置的ThreadPoolTaskExecutor

5.測試代碼

@Resource
private FutureService futureService;

@Test
public void futureTest() throws InterruptedException, ExecutionException {
 long start = System.currentTimeMillis();
 System.out.println("開始");
 //耗時任務(wù)
 Future<String> future = futureService.futureTest();
 //另外一個耗時任務(wù)
 Thread.sleep(500);
 System.out.println("另外一個耗時任務(wù),需要500ms");

 String s = future.get();
 System.out.println("計算結(jié)果輸出:" + s);
 System.out.println("共耗時:" + (System.currentTimeMillis() - start));
}

6.運行結(jié)果

開始
2019-01-07 23:50:34.726 INFO 14648 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
任務(wù)執(zhí)行開始,需要:1000ms
do:0
do:1
do:2
do:3
另外一個耗時任務(wù),需要500ms
do:4
do:5
do:6
do:7
do:8
do:9
完成任務(wù)
計算結(jié)果輸出:ThreadPoolTaskExecutor-1
共耗時:1016

Process finished with exit code 0

本來需要至少1500ms 執(zhí)行的任務(wù)現(xiàn)在只需要1016ms,因為在執(zhí)行耗時任務(wù)1的同時也在執(zhí)行耗時任務(wù)2,兩個任務(wù)并行執(zhí)行,這就是future模式的好處,在等待時間內(nèi)去執(zhí)行其它任務(wù),能夠充分利用時間

【注】本文基于SpringBoot 2.0

GitHub 連接

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

洱源县| 垦利县| 靖安县| 贺兰县| 牡丹江市| 宝坻区| 惠州市| 涞水县| 淮北市| 大方县| 沙田区| 枣阳市| 淳化县| 夏河县| 元江| 孟连| 长海县| 德兴市| 来宾市| 萨迦县| 金昌市| 贞丰县| 抚松县| 全椒县| 托克托县| 泽州县| 海淀区| 海原县| 文山县| 醴陵市| 大丰市| 大同市| 安康市| 剑阁县| 无棣县| 徐州市| 六枝特区| 绥江县| 中西区| 正阳县| 淮安市|