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

說說Java異步調(diào)用的幾種方式

 更新時間:2021年08月03日 08:44:16   作者:Acelin_H  
本文主要介紹了說說Java異步調(diào)用的幾種方式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

日常開發(fā)中,會經(jīng)常遇到說,前臺調(diào)服務(wù),然后觸發(fā)一個比較耗時的異步服務(wù),且不用等異步任務(wù)的處理結(jié)果就對原服務(wù)進行返回。這里就涉及的Java異步調(diào)用的一個知識。下面本文嘗試將Java異步調(diào)用的多種方式進行歸納。

一、通過創(chuàng)建新線程

首先的我們得認識到,異步調(diào)用的本質(zhì),其實是通過開啟一個新的線程來執(zhí)行。如以下例子:

public static void main(String[] args) throws Exception{

    System.out.println("主線程 =====> 開始 =====> " + System.currentTimeMillis());

    new Thread(() -> {
        System.out.println("異步線程 =====> 開始 =====> " + System.currentTimeMillis());
        try{
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("異步線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
    }).start();

    Thread.sleep(2000);

    System.out.println("主線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
    
}

數(shù)據(jù)結(jié)果如下所示,我們知道,System.currentTimeMillis()時間單位為ms。

主線程 =====> 開始 =====> 1627893837146
異步線程 =====> 開始 =====> 1627893837200
主線程 =====> 結(jié)束 =====> 1627893839205
異步線程 =====> 結(jié)束 =====> 1627893842212

我們通過線程休眠來達成主線程執(zhí)行時間2秒左右,異步線程執(zhí)行5秒左右的效果。通過打印出來的時間戳倒數(shù)第四位(秒位)我們可以看出,兩個的線程執(zhí)行總時間為5秒左右,符合異步執(zhí)行的特征

以上是采用Runable實現(xiàn)多線程創(chuàng)建方式的lambda寫法,關(guān)于的lambda知識,可參考Java Lambda 表達式;而關(guān)于多線程的多種實現(xiàn)方式,Java多線程事務(wù)管理一文有提及,可移步查看

二、通過線程池

因為異步任務(wù)的實現(xiàn)本質(zhì)的由新線程來執(zhí)行任務(wù),所以通過線程池的也可以實現(xiàn)異步執(zhí)行。寫法同我們利用線程池開啟多線程一樣。但由于我們的目的不是執(zhí)行多線程,而是異步執(zhí)行任務(wù),所以一般需要另外一個線程就夠了。

因此區(qū)別于執(zhí)行多線程任務(wù)的我們常用的newFixedThreadPool,在執(zhí)行異步任務(wù)時,我們用newSingleThreadExecutor 來創(chuàng)建一個單個線程的線程池。

public static void main(String[] args) throws Exception{

    System.out.println("主線程 =====> 開始 =====> " + System.currentTimeMillis());

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.submit(()->{
        System.out.println("異步線程 =====> 開始 =====> " + System.currentTimeMillis());
        try{
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("異步線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
    });
    executorService.shutdown(); // 回收線程池

    Thread.sleep(2000);

    System.out.println("主線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
    
}

執(zhí)行結(jié)果如下:

主線程 =====> 開始 =====> 1627895467578
異步線程 =====> 開始 =====> 1627895467635
主線程 =====> 結(jié)束 =====> 1627895469644
異步線程 =====> 結(jié)束 =====> 1627895472649

可以看到,結(jié)果跟第一種結(jié)果是基本一致的。

溫馨提示:不要忘記線程池的回收

三、通過@Async注解

我們都知道,SpringBoot項目有一個的很重要的特點就是的注解化。如果你的項目是SpringBoot,那就又多了一種選擇——@Async注解。

使用起來也非常簡單,將要異步執(zhí)行的代碼封裝成一個方法,然后用@Async注解該方法,然后在主方法中直接調(diào)用就行。

@Test
public void mainThread() throws Exception{

    System.out.println("主線程 =====> 開始 =====> " + System.currentTimeMillis());
    collectionBill.asyncThread();
    Thread.sleep(2000);
    System.out.println("主線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());

    Thread.sleep(4000); // 用于防止jvm停止,導(dǎo)致異步線程中斷
}
@Async
public void asyncThread(){
    System.out.println("異步線程 =====> 開始 =====> " + System.currentTimeMillis());
    try{
        Thread.sleep(5000);
    }catch (InterruptedException e){
        e.printStackTrace();
    }
    System.out.println("異步線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
}

執(zhí)行結(jié)果如下:

主線程 =====> 開始 =====> 1627897539948
異步線程 =====> 開始 =====> 1627897539956
主線程 =====> 結(jié)束 =====> 1627897541965
異步線程 =====> 結(jié)束 =====> 1627897544966

有以下兩點需要注意:

類似@Tranctional注解,@Async注解的方法與調(diào)用方法不能在同一個類中,否則不生效
JUnit框架的設(shè)計不考慮多線程場景,所以主線程退出后,子線程也會跟著立即退出,所以可以在后面加多線程休眠時間來觀察異步線程的執(zhí)行情況

四、通過CompletableFuture

CompletableFuture是JDK1.8的新特性,是對Future的擴展。CompletableFuture實現(xiàn)了CompletionStage接口和Future接口,增加了異步回調(diào)、流式處理、多個Future組合處理的能力。

實現(xiàn)代碼如下:

public static void main(String[] args) throws Exception{

    System.out.println("主線程 =====> 開始 =====> " + System.currentTimeMillis());

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    CompletableFuture.runAsync(() ->{
        System.out.println("異步線程 =====> 開始 =====> " + System.currentTimeMillis());
        try{
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("異步線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
    },executorService);
    executorService.shutdown(); // 回收線程池

    Thread.sleep(2000);

    System.out.println("主線程 =====> 結(jié)束 =====> " + System.currentTimeMillis());
    
}

同樣可以實現(xiàn)類似的結(jié)果如下:

主線程 =====> 開始 =====> 1627898354914
異步線程 =====> 開始 =====> 1627898354977
主線程 =====> 結(jié)束 =====> 1627898356980
異步線程 =====> 結(jié)束 =====> 1627898359979

CompletableFuture有者非常強大的功能,能給我們帶來非常絲滑的編程體驗。后續(xù)會寫一篇文章來詳細介紹CompletableFuture

到此這篇關(guān)于說說Java異步調(diào)用的幾種方式的文章就介紹到這了,更多相關(guān)Java異步調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法

    SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • SpringBoot整合阿里云短信服務(wù)的方法

    SpringBoot整合阿里云短信服務(wù)的方法

    在實際項目中經(jīng)常有發(fā)送短信的功能,今天進說一下SpringBoot整合阿里云短信服務(wù)的相關(guān)知識,新建短信微服務(wù),編寫發(fā)送短信接口的方法文中給大家介紹的很詳細,需要的朋友參考下吧
    2021-10-10
  • Java并發(fā)工具類Future使用示例

    Java并發(fā)工具類Future使用示例

    這篇文章主要介紹了Java并發(fā)工具類Future使用示例,本文需要注意future.get()方法是阻塞式的,如果調(diào)用該方法的時候任務(wù)尚未執(zhí)行完成,則會一直等待下去,直到任務(wù)執(zhí)行結(jié)束,本文通過示例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-06-06
  • Java實現(xiàn)矩形碰撞檢測

    Java實現(xiàn)矩形碰撞檢測

    這篇文章主要為大家詳細介紹了Java實現(xiàn)矩形碰撞檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java中Jedis基本使用

    Java中Jedis基本使用

    Redis的Java實現(xiàn)的客戶端,本文主要介紹了Java中Jedis基本使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 解讀Spring-boot的debug調(diào)試

    解讀Spring-boot的debug調(diào)試

    這篇文章主要介紹了解讀Spring-boot的debug調(diào)試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java畢業(yè)設(shè)計實戰(zhàn)之寵物醫(yī)院與商城一體的系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之寵物醫(yī)院與商城一體的系統(tǒng)的實現(xiàn)

    這是一個使用了java+Springboot+Jsp+maven+Mysql開發(fā)的寵物醫(yī)院與商城一體的系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有寵物醫(yī)院和寵物商城該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • springboot項目Redis統(tǒng)計在線用戶的實現(xiàn)示例

    springboot項目Redis統(tǒng)計在線用戶的實現(xiàn)示例

    最近做個項目需要統(tǒng)計在線用戶,本文主要介紹了springboot項目Redis統(tǒng)計在線用戶的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Java的long和bigint長度對比詳解

    Java的long和bigint長度對比詳解

    在本文中小編給大家分享了關(guān)于Java的long和bigint長度比較的知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2019-07-07
  • Spring事務(wù)管理詳細講解

    Spring事務(wù)管理詳細講解

    事務(wù)的作用就是為了保證用戶的每一個操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就?回退到事務(wù)開始未進行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring?Boot開發(fā)應(yīng)用時,大部分情況下也都需要使用事務(wù)
    2022-10-10

最新評論