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

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

網易面試:SpringBoot如何開啟虛擬線程?

來源: 責編: 時間:2024-06-12 08:44:59 155觀看
導讀虛擬線程(Virtual Thread)也稱協程或纖程,是一種輕量級的線程實現,與傳統的線程以及操作系統級別的線程(也稱為平臺線程)相比,它的創建開銷更小、資源利用率更高,是 Java 并發編程領域的一項重要創新。PS:虛擬線程正式發布于 J

YoY28資訊網——每日最新資訊28at.com

虛擬線程(Virtual Thread)也稱協程或纖程,是一種輕量級的線程實現,與傳統的線程以及操作系統級別的線程(也稱為平臺線程)相比,它的創建開銷更小、資源利用率更高,是 Java 并發編程領域的一項重要創新。YoY28資訊網——每日最新資訊28at.com

PS:虛擬線程正式發布于 Java 長期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。YoY28資訊網——每日最新資訊28at.com

虛擬線程是一種在 Java 虛擬機(JVM)層面實現的邏輯線程,不直接和操作系統的物理線程一一對應,因此它可以減少上下文切換所帶來的性能開銷。YoY28資訊網——每日最新資訊28at.com

操作系統線程、普通線程(Java 線程)和虛擬線程的關系如下:YoY28資訊網——每日最新資訊28at.com

YoY28資訊網——每日最新資訊28at.com

1.虛擬線程使用

虛擬線程的創建有以下 4 種方式:YoY28資訊網——每日最新資訊28at.com

  • Thread.startVirtualThread(Runnable task)
  • Thread.ofVirtual().unstarted(Runnable task)
  • Thread.ofVirtual().factory()
  • Executors.newVirtualThreadPerTaskExecutor()

具體使用如下。YoY28資訊網——每日最新資訊28at.com

(1)startVirtualThread

創建虛擬線程,并直接啟動執行任務:YoY28資訊網——每日最新資訊28at.com

// 創建并啟動虛擬線程Thread.startVirtualThread(() -> {    System.out.println("Do virtual thread.");});

(2)unstarted

只創建虛擬線程,但不直接啟動(創建之后通過 start 啟動):YoY28資訊網——每日最新資訊28at.com

// 創建虛擬線程Thread vt = Thread.ofVirtual().unstarted(()->{    System.out.println("Do virtual thread.");});// 運行虛擬線程vt.start();

(3)factory

先創建虛擬線程工廠,然后再使用工廠創建虛擬線程,之后再調用 start() 方法進行執行:YoY28資訊網——每日最新資訊28at.com

// 創建虛擬線程工廠ThreadFactory tf = Thread.ofVirtual().factory();// 創建虛擬線程Thread vt = tf.newThread(()->{    System.out.println("Do virtual thread.");});// 運行虛擬線程vt.start();

(4)newVirtualThreadPerTaskExecutor

創建虛擬線程池:YoY28資訊網——每日最新資訊28at.com

// 創建一個支持虛擬線程的線程池ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();executor.submit(()->{    System.out.println("Do virtual thread.");});

2.虛擬線程 VS 普通線程

虛擬線程和普通線程的區別主要體現在以下幾點:YoY28資訊網——每日最新資訊28at.com

  • 普通線程是和操作系統的物理線程是一一對應的,而虛擬線程是 JVM 層面的邏輯線程,并不和操作系統的物理線程一一對應,它可以看作是輕量級的線程。
  • 普通線程默認創建的是用戶線程(而守護線程),而虛擬線程是守護線程,并且其守護線程的屬性不能被修改,如果修改就會報錯,如下圖所示:

YoY28資訊網——每日最新資訊28at.com

  • 虛擬線程由 JVM 調度和使用,避免了普通線程頻繁切換的性能開銷,所以相比于普通的線程來說,運行效率更高。

3.SpringBoot開啟虛擬線程

以最新版的 Spring Boot 3.x 為例,我們開啟虛擬線程很簡單,只需要在 Spring Boot 配置文件中設置“spring.threads.virtual.enabled”為“true”即可開啟,以 application.yml 為例,啟用虛擬線程配置如下:YoY28資訊網——每日最新資訊28at.com

spring:  threads:    virtual:      enabled: true # 啟用虛擬線程

這樣 Spinrg Boot 在啟動 Tomcat 容器時,會使用一個虛擬線程執行器來代表原有的平臺線程池。YoY28資訊網——每日最新資訊28at.com

PS:這里是虛擬線程執行器,不是虛擬線程池。YoY28資訊網——每日最新資訊28at.com

如果以上配置未生效的話,還可以通過修改 Tomcat 配置類,讓其使用虛擬線程來處理每一個請求,配置代碼如下:YoY28資訊網——每日最新資訊28at.com

import java.util.concurrent.Executors;import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class TomcatConfiguration {    @Bean    public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {        return protocolHandler -> {            // 使用虛擬線程來處理每一個請求            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());        };    }}

4.異步任務開啟虛擬線程

如果你想為 Spring Boot 中的異步任務 @Async 也配置虛擬線程的話,可以在 AsyncConfigurer 配置類中設置,配置代碼如下:YoY28資訊網——每日最新資訊28at.com

import java.util.concurrent.Executor;import java.util.concurrent.Executors;import org.springframework.context.annotation.Configuration;import org.springframework.core.task.support.TaskExecutorAdapter;import org.springframework.scheduling.annotation.AsyncConfigurer;import org.springframework.scheduling.annotation.EnableAsync;@Configuration@EnableAsync  // 開啟異步任務public class AsyncTaskConfiguration implements AsyncConfigurer {    @Override    public Executor getAsyncExecutor() {        return new TaskExecutorAdapter(Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("virtual-async#", 1).factory()));    }}

本文鏈接:http://www.www897cc.com/showinfo-26-93207-0.html網易面試:SpringBoot如何開啟虛擬線程?

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

上一篇: 警惕!SpringBoot錯誤發布事件,造成死鎖Deadlock

下一篇: 前端JS發起的請求能暫停嗎?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 若羌县| 涞源县| 田东县| 临桂县| 乐清市| 桓台县| 伊金霍洛旗| 安达市| 遵化市| 赣州市| 龙里县| 台前县| 玉田县| 砀山县| 荥经县| 正镶白旗| 井研县| 克拉玛依市| 宁远县| 合川市| 盐山县| 汾西县| 黑河市| 辛集市| 交城县| 柳林县| 思茅市| 怀集县| 怀化市| 乌兰察布市| 贵德县| 和静县| 阳东县| 航空| 祁连县| 延津县| 友谊县| 河北区| 吉林省| 赤水市| 芜湖县|