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

一次java異步任務的實戰(zhàn)記錄

 更新時間:2022年05月12日 12:33:13   作者:再見丶孫悟空  
最近做項目的時候遇到了一個小問題,從前臺提交到服務端A,A調(diào)用服務端B處理超時,下面這篇文章主要給大家介紹了一次java異步任務的實戰(zhàn)記錄,需要的朋友可以參考下

前言

最近在開發(fā)中遇到一個埋點的需求,考慮到不能影響原有業(yè)務邏輯,于是準備寫一個異步任務去異步執(zhí)行,但在 debug 的過程中卻發(fā)現(xiàn)了一個奇怪的問題。

一、什么是異步任務

無論是生活中還是程序里,大體可以分為兩種 : 同步和異步。

同步:比如你去吃海底撈,你要先點鍋底,再點菜,然后服務員上鍋底,再上菜,最后你才能吃上菜,這一過程得按順序來。

異步任務:還是去吃海底撈,吃的人很多,你前面有很多人,你可能要排隊,等到排到你才能再進入餐廳。但是如果中途你想去個廁所,怎么辦,回來還得重新排隊。于是就有了叫號,你先排隊取號,然后你可以去按個摩,看個電影,做個 spa ,買杯奶茶 .... 。終于到你了,這時候會 通知 你排到了,然后你就能進去了。這個過程便是異步的。

二、SpringBoot + Async

一開始想著開一個線程池,把任務丟線程池里去完成。

后來想起來 SpringBoot 有一個比較方便的 異步 框架 Async

代碼也很簡單,只需要在需要異步執(zhí)行的方法上加個 @Async ,SpringBoot 啟動類上添加  @EnableAsync 即可

    @Async
    public void task() {
        // do something
    }

三、踩坑日記

代碼雖然少,但是坑可不會隨著代碼量的減少而減少。

為了方便起見,我本地搭了個 demo,直接上代碼

@RestController
public class AsyncController {
    @Autowired
    private AsyncService asyncService;

    @GetMapping("/v1/say")
    public String sayV1() {
        asyncService.sayV1();
        return "success1";
    }

    @GetMapping("/v2/say")
    public String sayV2() {
        asyncService.sayV2();
        return "success2";
    }
}
@Service
public class AsyncService {
    public void sayV1() {
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("hello world");
    }

    @Async
    public void sayV2() {
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("hello world");
    }
}

很簡單的 demo,提供兩個接口,/v1/say 和 /v2/say,一個同步執(zhí)行,一個異步執(zhí)行,通過 sleep 3 秒來模擬耗時的任務

正常啟動,沒有任何問題,同步執(zhí)行的等 3 秒,主線程才會返回,異步執(zhí)行的立刻返回,等3 秒才會輸出 helloworld

但是,當我加上斷點后,問題產(chǎn)生了。

我先是在 打印 hello world 那行加上個斷點,效果和原來的一樣,只是打印前被阻塞了,但并不影響主線程的返回。

?編輯

但當我把斷點加在方法進來的位置,發(fā)現(xiàn) 主線程居然被阻塞了!

?編輯

四、解決

各種問題排查,@Async 沒有生效,異步任務等待主線程返回,都沒有找到有效的解決方法。

后來經(jīng)過一個同事提醒,會不會是 debug 功能阻塞的線程呢?

抱著試一試的態(tài)度,我找到了 debug 這邊的配置

?編輯

斷點可以選擇阻塞 jvm 或者是 阻塞當前線程,默認是阻塞 jvm。

將 suspend 選擇 Thread,便不會再阻塞主線程了

五、總結

我們都是站在巨人的肩膀上編程,很多事情都是只知其果,不知其因,debug 是我們常用的功能,但是卻不知道它真正的原理。日后遇到問題,要多從它的原理考慮。

到此這篇關于一次java異步任務的文章就介紹到這了,更多相關java異步任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解SpringBoot2 使用Spring Session集群

    詳解SpringBoot2 使用Spring Session集群

    這篇文章主要介紹了SpringBoot2 使用Spring Session集群,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • Java多線程 線程組原理及實例詳解

    Java多線程 線程組原理及實例詳解

    這篇文章主要介紹了Java多線程 線程組原理及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • IDEA代碼熱部署和熱加載的三種實現(xiàn)方案

    IDEA代碼熱部署和熱加載的三種實現(xiàn)方案

    在日常開發(fā)中,我們需要經(jīng)常修改 Java 代碼,手動重啟項目,查看修改后的效果,如果在項目小時,重啟速度比較快,等待的時間是較短的,我們可以使用代碼熱加載和熱部署解決該問題,本文給大家介紹了三種實現(xiàn)方案,需要的朋友可以參考下
    2023-11-11
  • Java Mail與Apache Mail發(fā)送郵件示例

    Java Mail與Apache Mail發(fā)送郵件示例

    這篇文章主要介紹了Java Mail與Apache Mail發(fā)送郵件示例的相關資料,需要的朋友可以參考下
    2014-10-10
  • Java list亂序的實現(xiàn)三種方法

    Java list亂序的實現(xiàn)三種方法

    本文主要介紹了Java list亂序的實現(xiàn)三種方法,包含Collections.shuffle()方法,random和Stream API這三種,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Java構造函數(shù)通透理解篇

    Java構造函數(shù)通透理解篇

    這篇文章主要介紹了Java構造函數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • ScheduledThreadPoolExecutor巨坑解決

    ScheduledThreadPoolExecutor巨坑解決

    這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Kafka在客戶端實現(xiàn)消息的發(fā)送與讀取

    Kafka在客戶端實現(xiàn)消息的發(fā)送與讀取

    這篇文章主要介紹了Kafka在客戶端實現(xiàn)消息的發(fā)送與讀取,KafkaProducer是用于發(fā)送消息的類,ProducerRecord類用于封裝Kafka的消息,KafkaProducer的實例化需要指定的參數(shù),Producer的參數(shù)定義在 org.apache.kafka.clients.producer.ProducerConfig類中,需要的朋友可以參考下
    2023-12-12
  • Java?獲取本機IP地址的實例代碼

    Java?獲取本機IP地址的實例代碼

    這篇文章主要介紹了Java?獲取本機IP地址,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • 詳解springboot中的jar包部署步驟

    詳解springboot中的jar包部署步驟

    這篇文章主要介紹了springboot中的jar包部署步驟及l(fā)inux中部署項目常用指令,需要的朋友可以參考下
    2018-07-07

最新評論