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 那行加上個斷點,效果和原來的一樣,只是列印前被阻塞了,但不影響主執行緒的回傳。
編輯
但當我把斷點加在方法進來的位置,發現 主執行緒居然被阻塞了!
編輯
四、解決
各種問題排查,@Async 沒有生效,非同步任務等待主執行緒返回,都沒有找到有效的解決方法。
後來經過一個同事提醒,會不會是 debug 功能阻塞的執行緒呢?
抱著試一試的態度,我找到了debug 這邊的配置
#編輯
斷點可以選擇阻塞jvm或是阻塞目前線程,預設是阻塞jvm。
將 suspend 選擇 Thread,便不會再阻塞主執行緒了
以上是Java非同步任務實作及分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
