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

Spring?Boot3虛擬線程的使用步驟詳解

 更新時間:2025年03月29日 10:25:38   作者:招風(fēng)的黑耳  
虛擬線程是 Java 19 中引入的一個新特性,旨在通過簡化線程管理來提升應(yīng)用程序的并發(fā)性能,這篇文章主要介紹了Spring?Boot3虛擬線程的使用步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

在Spring Boot非Web應(yīng)用中,使用虛擬線程時程序提前終止的問題及解決方案,可以通過以下步驟深入理解和驗證:

問題根源分析

  • JVM退出機(jī)制Java中,當(dāng)所有非守護(hù)線程結(jié)束時,JVM會立即退出。即使存在正在運(yùn)行的守護(hù)線程(如虛擬線程),JVM也不會等待它們完成。

  • 虛擬線程的特性

    • 虛擬線程(Thread.ofVirtual()默認(rèn)是守護(hù)線程,且無法通過setDaemon(false)修改。
    • 虛擬線程由JVM管理,不直接映射到操作系統(tǒng)線程,因此其生命周期與JVM的退出策略緊密相關(guān)。
  • 非Web應(yīng)用的默認(rèn)行為非Web應(yīng)用啟動后,若沒有其他非守護(hù)線程(如主線程、定時任務(wù)線程),JVM會立即退出。即使啟用了虛擬線程執(zhí)行任務(wù),由于虛擬線程是守護(hù)線程,無法阻止JVM退出。

解決方案驗證

Spring Boot從3.2.0-RC1開始提供spring.main.keep-alive=true配置,其原理如下:

  • KeepAlive監(jiān)聽器啟用后,Spring Boot會注冊一個KeepAlive監(jiān)聽器,在上下文刷新完成后啟動一個非守護(hù)線程(命名為keep-alive),該線程無限期休眠(Thread.sleep(Long.MAX_VALUE)),確保JVM不會退出。

  • 線程終止邏輯當(dāng)Spring上下文關(guān)閉時(如調(diào)用SpringApplication.exit()),KeepAlive監(jiān)聽器會中斷keep-alive線程,允許JVM正常退出。

驗證實(shí)驗

實(shí)驗1:未啟用keep-alive

// 虛擬線程執(zhí)行任務(wù)
OfVirtual virtual = Thread.ofVirtual().name("Task-");
virtual.start(() -> {
    System.out.println("任務(wù)開始");
    try { TimeUnit.SECONDS.sleep(5); } 
    catch (InterruptedException e) {}
    System.out.println("任務(wù)結(jié)束");
});
// 主線程休眠1秒
TimeUnit.SECONDS.sleep(1);

結(jié)果:僅輸出任務(wù)開始,程序立即退出。

原因:虛擬線程是守護(hù)線程,主線程結(jié)束后JVM直接退出。

實(shí)驗2:啟用keep-alive

application.properties中添加:

spring.main.keep-alive=true

結(jié)果:程序持續(xù)運(yùn)行5秒,完整輸出任務(wù)開始和任務(wù)結(jié)束。

原因keep-alive線程阻止JVM退出,等待虛擬線程任務(wù)完成。

擴(kuò)展建議

  • 任務(wù)完成檢測如果任務(wù)需要顯式通知完成,可結(jié)合CountDownLatchCompletableFuture

    CountDownLatch latch = new CountDownLatch(1);
    OfVirtual virtual = Thread.ofVirtual().name("Task-");
    virtual.start(() -> {
        try { /* 執(zhí)行任務(wù) */ }
        finally { latch.countDown(); }
    });
    latch.await(); // 阻塞直到任務(wù)完成
    
  • 資源清理確保在關(guān)閉應(yīng)用前終止所有虛擬線程,避免資源泄漏。可通過Thread.ofVirtual().factory().allThreads()獲取所有虛擬線程并中斷。

  • 日志與監(jiān)控啟用虛擬線程后,建議配置日志記錄線程信息(如%thread),以便區(qū)分平臺線程與虛擬線程。

結(jié)論

用戶提供的分析完全正確。虛擬線程的守護(hù)線程特性是導(dǎo)致非Web應(yīng)用提前退出的根本原因,而spring.main.keep-alive=true通過注入非守護(hù)線程有效解決了這一問題。此方案是Spring Boot官方推薦的標(biāo)準(zhǔn)做法,適用于需要長期運(yùn)行后臺任務(wù)(如定時任務(wù)、消息消費(fèi))的非Web場景。

到此這篇關(guān)于Spring Boot3虛擬線程的使用步驟詳解的文章就介紹到這了,更多相關(guān)SpringBoot3虛擬線程使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java泛型extends關(guān)鍵字設(shè)置邊界的實(shí)現(xiàn)

    Java泛型extends關(guān)鍵字設(shè)置邊界的實(shí)現(xiàn)

    這篇文章主要介紹了Java泛型extends關(guān)鍵字設(shè)置邊界的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實(shí)現(xiàn)

    SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Java I/O中I/O流的典型使用方式詳解

    Java I/O中I/O流的典型使用方式詳解

    這篇文章主要介紹了Java I/O中I/O流的典型使用方式詳解,盡管可以通過不同的方式組合IO流類,但我們可能也就只用到其中的幾種組合。下面的例子可以作為典型的IO用法的基本參考,,需要的朋友可以參考下
    2019-06-06
  • Maven的聚合(多模塊)和Parent繼承

    Maven的聚合(多模塊)和Parent繼承

    今天小編就為大家分享一篇關(guān)于Maven的聚合(多模塊)和Parent繼承,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Javabean基于xstream包實(shí)現(xiàn)轉(zhuǎn)XML文檔的方法

    Javabean基于xstream包實(shí)現(xiàn)轉(zhuǎn)XML文檔的方法

    這篇文章主要介紹了Javabean基于xstream包實(shí)現(xiàn)轉(zhuǎn)XML文檔的方法,結(jié)合具體實(shí)例形式分析了xstream包用于轉(zhuǎn)換xml文件的具體使用技巧,需要的朋友可以參考下
    2017-05-05
  • Spark學(xué)習(xí)筆記之Spark SQL的具體使用

    Spark學(xué)習(xí)筆記之Spark SQL的具體使用

    這篇文章主要介紹了Spark學(xué)習(xí)筆記之Spark SQL的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringData JPA實(shí)體映射與關(guān)系映射的實(shí)現(xiàn)

    SpringData JPA實(shí)體映射與關(guān)系映射的實(shí)現(xiàn)

    Spring Data JPA作為Spring生態(tài)系統(tǒng)中的核心項目,通過JPA規(guī)范提供了優(yōu)雅而強(qiáng)大的實(shí)體映射與關(guān)系處理機(jī)制,下面就來介紹一下,感興趣的可以了解一下
    2025-04-04
  • Java BigDecimal和double示例及相關(guān)問題解析

    Java BigDecimal和double示例及相關(guān)問題解析

    這篇文章主要介紹了Java BigDecimal和double示例及相關(guān)問題解析,簡單介紹了BigDecimal類的相關(guān)內(nèi)容,分享了兩則相關(guān)實(shí)例,對問題進(jìn)行了分析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 解析Java和IDEA中的文件打包問題

    解析Java和IDEA中的文件打包問題

    這篇文章主要介紹了Java和IDEA中的文件打包問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Java中的內(nèi)存模型JMM詳細(xì)解讀

    Java中的內(nèi)存模型JMM詳細(xì)解讀

    這篇文章主要介紹了Java中的內(nèi)存模型JMM詳細(xì)解讀,Java?對內(nèi)存的抽象模型如下,每個線程都有一塊自己的私有內(nèi)存(也稱為工作內(nèi)存),當(dāng)線程使用變量時,會把主內(nèi)存里面的變量復(fù)制到工作內(nèi)存,線程讀寫變量時操作的是自己工作內(nèi)存中的變量,需要的朋友可以參考下
    2023-12-12

最新評論