AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

SpringBoot3使用虛擬線程一定要小心了

來源: 責編: 時間:2024-05-11 09:21:24 306觀看
導讀環境:SpringBoot3.2.5 + JDK211.簡介SpringBoot從3.2.0-M1版本開始支持虛擬線程。虛擬線程是JDK 21版本正式發布的一個新特性,它與平臺線程的主要區別在于虛擬線程在運行周期內不依賴操作系統線程,而是與硬件脫鉤,因此被

環境:SpringBoot3.2.5 + JDK21FK228資訊網——每日最新資訊28at.com

1.簡介

SpringBoot從3.2.0-M1版本開始支持虛擬線程。虛擬線程是JDK 21版本正式發布的一個新特性,它與平臺線程的主要區別在于虛擬線程在運行周期內不依賴操作系統線程,而是與硬件脫鉤,因此被稱為“虛擬”。這種解耦是由JVM提供的抽象層賦予的,使得虛擬線程的運行成本遠低于平臺線程,并且可以消耗更少的內存。因此,從SpringBoot 3.2.0-M1開始,通過使用虛擬線程,提升系統的整體性能。FK228資訊網——每日最新資訊28at.com

虛擬線程在項目中應用時你稍不注意就可能出現問題。本篇文章將要講述的是在非Web應用的情況下使用虛擬線程出現的問題(并非BUG)。FK228資訊網——每日最新資訊28at.com

2. 實戰案例

注意:本案例是非Web應用。只要你不要引入spring-boot-starter-web模塊或者下面配置后都將以非web模式下運行。FK228資訊網——每日最新資訊28at.com

public static void main(String[] args) {  new SpringApplicationBuilder()    .sources(SpringbootNonWebApplication.class)    // 即便引入了web模塊,但這里設置為非web應用    .web(WebApplicationType.NONE)    .run(args) ;}

非web應用,啟動容器后并不會啟動嵌入式的web server,如果你當前應用中并沒有其它線程執行(非守護線程),那么程序將自動停止(啟動即停止)。FK228資訊網——每日最新資訊28at.com

圖片圖片FK228資訊網——每日最新資訊28at.com

啟動完后自動停止。FK228資訊網——每日最新資訊28at.com

2.1 啟動定時任務

在一個非web環境下啟動定時任務:FK228資訊網——每日最新資訊28at.com

@Componentpublic class TaskComponent {  @Scheduled(fixedRate = 3000)  public void task1() throws Exception {    System.out.printf("當前執行線程: %s%n", Thread.currentThread()) ;    // TODO 執行任務    TimeUnit.SECONDS.sleep(1) ;  }}

上面定義了每隔3s執行的定時任務(記得通過@EnableScheduling注解開啟任務調用功能)。FK228資訊網——每日最新資訊28at.com

啟動服務FK228資訊網——每日最新資訊28at.com

圖片圖片FK228資訊網——每日最新資訊28at.com

程序規律的執行,每隔3s輸出信息。FK228資訊網——每日最新資訊28at.com

2.2 虛擬線程執行任務

接下來開啟虛擬線程。FK228資訊網——每日最新資訊28at.com

如果運行的是 Java 21 或更高版本,可以通過配置如下屬性來啟用虛擬線程。FK228資訊網——每日最新資訊28at.com

spring:  threads:    virtual:      enabled: true

再次運行程序FK228資訊網——每日最新資訊28at.com

圖片圖片FK228資訊網——每日最新資訊28at.com

根據打印信息,執行線程確實是通過虛擬線程執行,但是僅僅啟動時輸出了一條信息,程序就終止了,這肯定不是我們想要的。什么原因呢?FK228資訊網——每日最新資訊28at.com

2.3 守護線程

這是一段非常簡單的代碼了FK228資訊網——每日最新資訊28at.com

Thread t = new Thread(() -> {  try {    System.out.println("start..." + System.currentTimeMillis()) ;    TimeUnit.SECONDS.sleep(5) ;  } catch (Exception e) {    e.printStackTrace() ;  }  System.out.println(" over..." + System.currentTimeMillis()) ;}) ;t.start() ;

輸出結果:FK228資訊網——每日最新資訊28at.com

start...1613150235234 over...1613150240238

程序等待3s后終止。接下來將上面Thread線程做如下配置:FK228資訊網——每日最新資訊28at.com

// 設置為守護線程t.setDaemon(true) ;

再次執行,這次執行控制臺不會有任何的輸出程序就終止了。FK228資訊網——每日最新資訊28at.com

在Java中當所有非守護線程都執行完以后,守護線程會自動終止;守護線程一般用于執行后臺任務,資源清理等。FK228資訊網——每日最新資訊28at.com

接下來通過虛擬線程執行上面的代碼:FK228資訊網——每日最新資訊28at.com

OfVirtual virtual = Thread.ofVirtual().name("Pack-") ;Thread t = virtual.start(() -> {  try {    System.out.println("start..." + System.currentTimeMillis()) ;    TimeUnit.SECONDS.sleep(5) ;  } catch (Exception e) {    e.printStackTrace() ;  }  System.out.println("over..." + System.currentTimeMillis()) ;}) ;TimeUnit.SECONDS.sleep(1) ;

等待1s后程序終止,只輸出如下結果:FK228資訊網——每日最新資訊28at.com

start...1613840844449

虛擬線程難道也是守護線程?FK228資訊網——每日最新資訊28at.com

通過如下代碼查看上面的虛擬線程是否是守護線程:FK228資訊網——每日最新資訊28at.com

System.out.println(t.isDaemon()) ;

輸出結果:FK228資訊網——每日最新資訊28at.com

true

既然是守護線程,那么程序自動停止也就不意外了。下面是來自官方對虛擬線程與平臺線程的區別:FK228資訊網——每日最新資訊28at.com

  • 虛擬線程始終是守護線程。Thread.setDaemon(boolean) 方法無法將虛擬線程更改為非守護線程。
  • 虛擬線程的固定優先級為 Thread.NORM_PRIORITY。Thread.setPriority(int) 方法對虛擬線程不起作用。這一限制可能會在未來的版本中重新考慮。
  • 虛擬線程不是線程組的活動成員。在虛擬線程上調用 Thread.getThreadGroup() 時,會返回一個名稱為 "VirtualThreads "的占位線程組。Thread.Builder API 沒有定義設置虛擬線程線程組的方法。

2.4 KeepAlive虛擬線程

既然虛擬線程是守護線程,那么要如何解決上面的問題呢?在SpringBoot3.2.0-RC1版本開始為SpringApplication添加"keep-alive"屬性,專門解決虛擬線程問題。FK228資訊網——每日最新資訊28at.com

可以通過如下配置開啟keepAlive。FK228資訊網——每日最新資訊28at.com

spring:  main:    keep-alive: true

通過上面的配置后,再次運行上面的程序FK228資訊網——每日最新資訊28at.com

圖片圖片FK228資訊網——每日最新資訊28at.com

這時候程序不會退出了一直運行。?FK228資訊網——每日最新資訊28at.com

2.5 實現原理

當開啟上面的spring.main.keep-alive=true后,springboot在啟動時會注冊一個監聽器。FK228資訊網——每日最新資訊28at.com

public class SpringApplication {  public ConfigurableApplicationContext run(String... args) {    // ...    prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);    // ...  }  private void prepareContext(...) {    // ...    // SpringBoot在啟動時準備Environment時會自動將spring.main下的    // 屬性配置綁定到當前的SpringApplication對象中(屬性)。    if (this.keepAlive) {      // 添加事件監聽      context.addApplicationListener(new KeepAlive());    }    // ...  }}

事件監聽程序KeepAlive。FK228資訊網——每日最新資訊28at.com

private static final class KeepAlive implements ApplicationListener<ApplicationContextEvent> {  public void onApplicationEvent(ApplicationContextEvent event) {    if (event instanceof ContextRefreshedEvent) {      // Spring上下文刷新完成      startKeepAliveThread();    }    // Spring容器在關閉時    else if (event instanceof ContextClosedEvent) {      stopKeepAliveThread();    }  }  private void startKeepAliveThread() {    // 啟動異步線程,一直休眠(保證一直運行著,這樣程序就不會終止了)    Thread thread = new Thread(() -> {      while (true) {        try {          Thread.sleep(Long.MAX_VALUE);        }      }    });    if (this.thread.compareAndSet(null, thread)) {      // 非守護線程      thread.setDaemon(false);      thread.setName("keep-alive");      thread.start();    }  }  private void stopKeepAliveThread() {    Thread thread = this.thread.getAndSet(null);    if (thread == null) {      return;    }    // 終止線程    thread.interrupt();  }}

SpringBoot實現邏輯還是非常簡單的。FK228資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-87991-0.htmlSpringBoot3使用虛擬線程一定要小心了

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一圖看懂 React 源碼中的同步更新邏輯

下一篇: Go語言整型(整數類型)的詳解

標簽:
  • 熱門焦點
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內,目前主要售賣美食相關的
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 小米公益基金會捐贈2500萬元馳援北京、河北暴雨救災

    8月2日消息,今日小米科技創始人雷軍在其微博上發布消息稱,小米公益基金會宣布捐贈2500萬元馳援北京、河北暴雨救災。攜手抗災,京冀安康!以下為公告原文
  • AMD的AI芯片轉單給三星可能性不大 與臺積電已合作至2nm制程

    據 DIGITIMES 消息,英偉達 AI GPU 出貨逐季飆升,接下來 AMD MI 300 系列將在第 4 季底量產。而半導體業內人士表示,近日傳出 AMD 的 AI 芯片將轉單給
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
  • 上海舉辦人工智能大會活動,建設人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術、新產品、新應用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發展盛典人工
Top