欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot對(duì)Future模式的支持詳解

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

前言

我們?cè)趯?shí)際項(xiàng)目中有些復(fù)雜運(yùn)算、耗時(shí)操作,就可以利用多線程來(lái)充分利用CPU,提高系統(tǒng)吞吐量。SpringBoot對(duì)多線程支持非常好,對(duì)我們的開發(fā)非常便捷。

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

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

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

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

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

2.需要的注解

springboot 配置多線程需要兩個(gè)注解

1、@EnableAsync

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

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

3.配置代碼

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

 @Override
 public Executor getAsyncExecutor() {
 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
 //核心線程數(shù)
 taskExecutor.setCorePoolSize(8);
 //最大線程數(shù)
 taskExecutor.setMaxPoolSize(16);
 //隊(duì)列大小
 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());
 }
}

【注】這里的方法自動(dòng)被注入使用上文配置的ThreadPoolTaskExecutor

5.測(cè)試代碼

@Resource
private FutureService futureService;

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

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

6.運(yùn)行結(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
另外一個(gè)耗時(shí)任務(wù),需要500ms
do:4
do:5
do:6
do:7
do:8
do:9
完成任務(wù)
計(jì)算結(jié)果輸出:ThreadPoolTaskExecutor-1
共耗時(shí):1016

Process finished with exit code 0

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

【注】本文基于SpringBoot 2.0

GitHub 連接

總結(jié)

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

相關(guān)文章

  • Spring Boot實(shí)現(xiàn)模塊化的幾種方法

    Spring Boot實(shí)現(xiàn)模塊化的幾種方法

    模塊可以是業(yè)務(wù)模塊,為應(yīng)用程序提供一些業(yè)務(wù)服務(wù),或者為幾個(gè)其他模塊或整個(gè)應(yīng)用程序提供跨領(lǐng)域關(guān)注的技術(shù)模塊。這篇文章主要介紹了Spring Boot實(shí)現(xiàn)模塊化,需要的朋友可以參考下
    2018-07-07
  • Java Vector實(shí)現(xiàn)班級(jí)信息管理系統(tǒng)

    Java Vector實(shí)現(xiàn)班級(jí)信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java Vector實(shí)現(xiàn)班級(jí)信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • @PostConstruct在項(xiàng)目啟動(dòng)時(shí)被執(zhí)行兩次或多次的原因及分析

    @PostConstruct在項(xiàng)目啟動(dòng)時(shí)被執(zhí)行兩次或多次的原因及分析

    這篇文章主要介紹了@PostConstruct在項(xiàng)目啟動(dòng)時(shí)被執(zhí)行兩次或多次的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java迭代器和for循環(huán)優(yōu)劣詳解

    java迭代器和for循環(huán)優(yōu)劣詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java迭代器和for循環(huán)優(yōu)劣詳解內(nèi)容,對(duì)此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • 基于java實(shí)現(xiàn)websocket協(xié)議過(guò)程詳解

    基于java實(shí)現(xiàn)websocket協(xié)議過(guò)程詳解

    這篇文章主要介紹了基于java實(shí)現(xiàn)websocket協(xié)議過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • springboot中swagger快速啟動(dòng)流程

    springboot中swagger快速啟動(dòng)流程

    這篇文章主要介紹了springboot中的swagger快速啟動(dòng)流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringMVC中controller接收json數(shù)據(jù)的方法

    SpringMVC中controller接收json數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC中controller接收json數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java中的自旋鎖與適應(yīng)性自旋鎖的區(qū)別

    Java中的自旋鎖與適應(yīng)性自旋鎖的區(qū)別

    這篇文章主要介紹了Java中的自旋鎖與適應(yīng)性自旋鎖的區(qū)別,當(dāng)一個(gè)線程嘗試去獲取某一把鎖的時(shí)候,如果這個(gè)鎖此時(shí)已經(jīng)被別人獲取(占用),那么此線程就無(wú)法獲取到這把鎖,該線程將會(huì)等待,間隔一段時(shí)間后會(huì)再次嘗試獲取,需要的朋友可以參考下
    2023-10-10
  • java.lang.NoClassDefFoundError錯(cuò)誤的原因及解決方法

    java.lang.NoClassDefFoundError錯(cuò)誤的原因及解決方法

    這篇文章主要給大家介紹了關(guān)于java.lang.NoClassDefFoundError錯(cuò)誤的原因及解決的相關(guān)資料,java.lang.NoClassDefFoundError是Java虛擬機(jī)在運(yùn)行時(shí)無(wú)法找到特定類的錯(cuò)誤,需要的朋友可以參考下
    2023-10-10
  • Spring創(chuàng)建bean對(duì)象三種方式代碼實(shí)例

    Spring創(chuàng)建bean對(duì)象三種方式代碼實(shí)例

    這篇文章主要介紹了Spring創(chuàng)建bean對(duì)象三種方式代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論