中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java異步任務實例分析

發布時間:2022-05-12 15:22:10 來源:億速云 閱讀:177 作者:iii 欄目:開發技術

本篇內容主要講解“java異步任務實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java異步任務實例分析”吧!

一、什么是異步任務

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

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

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

二、SpringBoot + Async

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

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

代碼也很簡單,只需要在需要異步執行的方法上加個 @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,一個同步執行,一個異步執行,通過 sleep 3 秒來模擬耗時的任務

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

但是,當我加上斷點后,問題產生了。

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

java異步任務實例分析

編輯

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

java異步任務實例分析

編輯

四、解決

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

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

抱著試一試的態度,我找到了 debug 這邊的配置

java異步任務實例分析

編輯

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

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

到此,相信大家對“java異步任務實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤山市| 康保县| 华亭县| 将乐县| 梧州市| 鲁山县| 呼伦贝尔市| 鄂尔多斯市| 南澳县| 观塘区| 崇左市| 合江县| 中山市| 克什克腾旗| 和平区| 连城县| 巫山县| 乌什县| 赞皇县| 天台县| 黄石市| 莒南县| 沂水县| 郑州市| 衡南县| 崇义县| 彭泽县| 绍兴市| 乌拉特后旗| 乌鲁木齐县| 巧家县| 常德市| 山阴县| 西吉县| 资兴市| 翁牛特旗| 军事| 金川县| 建湖县| 广灵县| 荣昌县|