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

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

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

前言

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

一、什么是異步任務(wù)

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

同步:比如你去吃海底撈,你要先點(diǎn)鍋底,再點(diǎn)菜,然后服務(wù)員上鍋底,再上菜,最后你才能吃上菜,這一過(guò)程得按順序來(lái)。

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

二、SpringBoot + Async

一開始想著開一個(gè)線程池,把任務(wù)丟線程池里去完成。

后來(lái)想起來(lái) SpringBoot 有一個(gè)比較方便的 異步 框架 Async

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

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

三、踩坑日記

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

為了方便起見,我本地搭了個(gè) 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");
    }
}

很簡(jiǎn)單的 demo,提供兩個(gè)接口,/v1/say 和 /v2/say,一個(gè)同步執(zhí)行,一個(gè)異步執(zhí)行,通過(guò) sleep 3 秒來(lái)模擬耗時(shí)的任務(wù)

正常啟動(dòng),沒(méi)有任何問(wèn)題,同步執(zhí)行的等 3 秒,主線程才會(huì)返回,異步執(zhí)行的立刻返回,等3 秒才會(huì)輸出 helloworld

但是,當(dāng)我加上斷點(diǎn)后,問(wèn)題產(chǎn)生了。

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

?編輯

但當(dāng)我把斷點(diǎn)加在方法進(jìn)來(lái)的位置,發(fā)現(xiàn) 主線程居然被阻塞了!

?編輯

四、解決

各種問(wèn)題排查,@Async 沒(méi)有生效,異步任務(wù)等待主線程返回,都沒(méi)有找到有效的解決方法。

后來(lái)經(jīng)過(guò)一個(gè)同事提醒,會(huì)不會(huì)是 debug 功能阻塞的線程呢?

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

?編輯

斷點(diǎn)可以選擇阻塞 jvm 或者是 阻塞當(dāng)前線程,默認(rèn)是阻塞 jvm。

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

五、總結(jié)

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

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

相關(guān)文章

  • Java使用volatile關(guān)鍵字的注意事項(xiàng)

    Java使用volatile關(guān)鍵字的注意事項(xiàng)

    volatile關(guān)鍵字是Java中的一種稍弱的同步機(jī)制,為什么稱之為弱機(jī)制。這篇文章主要介紹了Java使用volatile關(guān)鍵字的注意事項(xiàng),需要的朋友可以參考下
    2017-02-02
  • Mybatis-plus如何在xml中傳入自定義的SQL語(yǔ)句

    Mybatis-plus如何在xml中傳入自定義的SQL語(yǔ)句

    這篇文章主要介紹了Mybatis-plus如何在xml中傳入自定義的SQL語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 簡(jiǎn)單了解Thymeleaf語(yǔ)法 數(shù)據(jù)延遲加載使用實(shí)例

    簡(jiǎn)單了解Thymeleaf語(yǔ)法 數(shù)據(jù)延遲加載使用實(shí)例

    這篇文章主要介紹了簡(jiǎn)單了解Thymeleaf語(yǔ)法 數(shù)據(jù)延遲加載使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2010-05-05
  • Spring Cloud Config分布式配置中心使用介紹詳解

    Spring Cloud Config分布式配置中心使用介紹詳解

    分布式配置中心應(yīng)用場(chǎng)景 往往,我們使用配置文件管理?些配置信息,比如application.yml 單體應(yīng)用架構(gòu):配置信息的管理、維護(hù)并不會(huì)顯得特別麻煩,手動(dòng)操作就可以,因?yàn)榫鸵粋€(gè)工程
    2022-09-09
  • Java深度復(fù)制功能與用法實(shí)例分析

    Java深度復(fù)制功能與用法實(shí)例分析

    這篇文章主要介紹了Java深度復(fù)制功能與用法,簡(jiǎn)單講述了深度復(fù)制的概念、功能并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)深度復(fù)制的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java中串行接口調(diào)用優(yōu)化方式

    Java中串行接口調(diào)用優(yōu)化方式

    這篇文章主要介紹了Java中串行接口調(diào)用優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 使用mybatis-plus想要修改某字段為null問(wèn)題

    使用mybatis-plus想要修改某字段為null問(wèn)題

    這篇文章主要介紹了使用mybatis-plus想要修改某字段為null問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • JAVA十大排序算法之快速排序詳解

    JAVA十大排序算法之快速排序詳解

    這篇文章主要介紹了java中的快速排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java如何基于反射機(jī)制獲取不同的類

    Java如何基于反射機(jī)制獲取不同的類

    這篇文章主要介紹了Java如何基于反射機(jī)制獲取不同的類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • idea導(dǎo)入jar包的詳細(xì)圖文教程

    idea導(dǎo)入jar包的詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于idea導(dǎo)入jar包的詳細(xì)圖文教程,文中通過(guò)圖文將導(dǎo)入的步驟介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

油尖旺区| 马公市| 中卫市| 裕民县| 余姚市| 永胜县| 榆林市| 沈阳市| 双城市| 牡丹江市| 安陆市| 麟游县| 湘西| 朝阳市| 石台县| 绍兴县| 灌南县| 牙克石市| 满洲里市| 东乡| 班戈县| 黄冈市| 依安县| 琼中| 浪卡子县| 双桥区| 克什克腾旗| 石屏县| 郓城县| 农安县| 灵寿县| 凤庆县| 霍林郭勒市| 大安市| 西畴县| 黄骅市| 万宁市| 鞍山市| 隆回县| 沧源| 成武县|