日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

1.簡介

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

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

2. 實戰案例

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

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

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

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

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

2.1 啟動定時任務

在一個非web環境下啟動定時任務:MmQ28資訊網——每日最新資訊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注解開啟任務調用功能)。MmQ28資訊網——每日最新資訊28at.com

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

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

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

2.2 虛擬線程執行任務

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

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

spring:  threads:    virtual:      enabled: true

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

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

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

2.3 守護線程

這是一段非常簡單的代碼了MmQ28資訊網——每日最新資訊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() ;

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

start...1613150235234 over...1613150240238

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

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

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

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

接下來通過虛擬線程執行上面的代碼:MmQ28資訊網——每日最新資訊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后程序終止,只輸出如下結果:MmQ28資訊網——每日最新資訊28at.com

start...1613840844449

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

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

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

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

true

既然是守護線程,那么程序自動停止也就不意外了。下面是來自官方對虛擬線程與平臺線程的區別:MmQ28資訊網——每日最新資訊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"屬性,專門解決虛擬線程問題。MmQ28資訊網——每日最新資訊28at.com

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

spring:  main:    keep-alive: true

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

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

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

2.5 實現原理

當開啟上面的spring.main.keep-alive=true后,springboot在啟動時會注冊一個監聽器。MmQ28資訊網——每日最新資訊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。MmQ28資訊網——每日最新資訊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實現邏輯還是非常簡單的。MmQ28資訊網——每日最新資訊28at.com

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

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

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

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲福利专区| 国产精品久久久一区麻豆最新章节 | 亚洲欧美国产视频| 欧美一区二区日韩一区二区| 久久狠狠亚洲综合| 免费高清在线视频一区·| 欧美日韩精品免费观看视一区二区 | 久久精品国产精品亚洲| 免费在线亚洲| 欧美视频在线观看免费网址| 国产欧美视频在线观看| 亚洲福利av| 亚洲午夜精品17c| 久久九九免费视频| 欧美日本国产一区| 国产性天天综合网| 亚洲人妖在线| 欧美在线视频在线播放完整版免费观看 | 欧美大片免费观看在线观看网站推荐| 欧美日韩在线综合| 狠久久av成人天堂| 亚洲最新色图| 久久欧美中文字幕| 国产精品久久久久久久免费软件| 韩国av一区二区| 一区二区三区四区蜜桃| 久久麻豆一区二区| 国产精品天美传媒入口| 91久久午夜| 久久9热精品视频| 欧美日韩精品久久| 亚洲第一福利在线观看| 亚洲欧美日韩系列| 欧美精品一区二| 激情五月***国产精品| 亚洲影音一区| 欧美激情视频一区二区三区不卡| 国产欧美亚洲视频| 99国产精品久久久久久久成人热 | 久久九九热免费视频| 欧美日精品一区视频| 亚洲成人中文| 久久黄色网页| 国产精品www994| 亚洲国产精品一区在线观看不卡| 欧美一级视频免费在线观看| 欧美日韩国产一中文字不卡| 在线观看亚洲a| 欧美一区午夜精品| 国产精品久久久久久久第一福利| 亚洲精品欧美激情| 另类春色校园亚洲| 国产自产精品| 午夜激情一区| 国产精品国产三级国产a| 亚洲国产一区二区a毛片| 久久国产精品99国产精| 国产精品手机视频| 一区二区高清视频| 农村妇女精品| 在线精品视频在线观看高清| 欧美一级淫片aaaaaaa视频| 国产精品久久波多野结衣| 日韩视频在线你懂得| 欧美激情久久久久| 亚洲三级视频| 欧美国产视频日韩| 国产主播一区二区三区四区| 午夜欧美精品久久久久久久| 欧美视频一区二区三区四区| 99人久久精品视频最新地址| 欧美国产激情| 亚洲精品国久久99热| 欧美成人午夜激情视频| 亚洲国产成人午夜在线一区 | 欧美日韩在线一区二区三区| 日韩手机在线导航| 欧美欧美天天天天操| 亚洲精品综合精品自拍| 欧美激情一区二区在线| 亚洲精品乱码久久久久久日本蜜臀 | 老司机67194精品线观看| 国内免费精品永久在线视频| 欧美在线视频网站| 国产一区二区三区四区hd| 久久成人国产| 国产色婷婷国产综合在线理论片a| 亚洲欧美国产日韩中文字幕| 国产精品成人一区二区三区夜夜夜| 一本色道久久加勒比精品| 欧美精品在线观看91| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩精品久久久| 中日韩男男gay无套| 国产精品theporn88| 亚洲男女自偷自拍图片另类| 国产模特精品视频久久久久| 欧美一区亚洲| 在线不卡中文字幕播放| 欧美不卡三区| 日韩视频免费看| 国产精品久久77777| 欧美亚洲综合久久| 在线成人中文字幕| 欧美连裤袜在线视频| 亚洲天堂久久| 国内精品一区二区| 欧美电影在线观看完整版| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲图中文字幕| 国产精品欧美久久久久无广告| 午夜在线a亚洲v天堂网2018| 国产亚洲精品福利| 男女激情视频一区| 99国产精品国产精品久久| 国产精品一区=区| 久久香蕉国产线看观看av| 亚洲日本理论电影| 国产精品久久999| 久久久精品五月天| 91久久精品国产91性色| 国产精品高清免费在线观看| 欧美在线观看你懂的| 亚洲黄色尤物视频| 欧美性生交xxxxx久久久| 久久精品99久久香蕉国产色戒| 亚洲国产午夜| 国产精品美女一区二区在线观看| 久久精品视频在线看| 日韩视频一区二区三区在线播放| 国产精品中文字幕欧美| 欧美aⅴ99久久黑人专区| 亚洲一区久久久| 黄色精品一二区| 欧美日韩一区二区在线| 久久精选视频| 在线亚洲伦理| 伊人蜜桃色噜噜激情综合| 欧美视频手机在线| 久久永久免费| 午夜精品久久久久久久蜜桃app| 亚洲电影在线看| 国产精品视频最多的网站| 免费亚洲婷婷| 亚洲自拍偷拍一区| 亚洲国产欧美在线人成| 国产日韩欧美| 欧美日韩www| 久久久久久久久综合| 亚洲四色影视在线观看| 亚洲福利国产精品| 国产乱肥老妇国产一区二| 欧美激情视频在线播放 | 午夜日韩在线| 99亚洲一区二区| 在线观看精品| 国产精品久久久一区二区| 欧美二区乱c少妇| 欧美一区综合| 亚洲天堂偷拍| 最近中文字幕mv在线一区二区三区四区 | 一本久道久久综合中文字幕 | 99在线精品视频| 在线看日韩av| 国产亚洲精品久久久久动| 欧美视频在线看| 欧美xxx成人| 久久久国产精品亚洲一区 | 亚洲综合视频在线| 日韩亚洲欧美一区二区三区| 在线播放不卡| 国产综合色产| 国产欧美在线| 国产精品久99| 欧美日韩亚洲激情| 欧美福利视频一区| 久久一区二区三区四区| 篠田优中文在线播放第一区| 亚洲视频一区二区| 亚洲美女电影在线| 亚洲国产视频一区二区| 一区二区三区在线观看视频| 国产亚洲福利| 国产毛片一区| 国产精品丝袜xxxxxxx| 国产精品美女www爽爽爽视频| 欧美日韩国产精品一区二区亚洲| 免费成人网www| 老鸭窝91久久精品色噜噜导演| 久久不射中文字幕| 久久精品国产综合| 久久精品官网| 久久精品国语| 久久久久久久一区二区| 欧美一级在线播放| 亚洲欧美视频在线观看| 午夜久久福利| 欧美在线观看你懂的| 欧美一区二区视频观看视频| 香蕉久久一区二区不卡无毒影院 | 亚洲精品久久嫩草网站秘色| 亚洲国产日韩欧美在线图片| 亚洲国产精品尤物yw在线观看| 亚洲二区在线视频|