最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot開啟虛擬線程的實(shí)現(xiàn)流程

 更新時間:2024年06月13日 08:20:56   作者:Java中文社群  
虛擬線程(Virtual?Thread)也稱協(xié)程或纖程,是一種輕量級的線程實(shí)現(xiàn),與傳統(tǒng)的線程以及操作系統(tǒng)級別的線程(也稱為平臺線程)相比,它的創(chuàng)建開銷更小、資源利用率更高,本文給大家介紹了SpringBoot如何開啟虛擬線程,需要的朋友可以參考下

引言

虛擬線程(Virtual Thread)也稱協(xié)程或纖程,是一種輕量級的線程實(shí)現(xiàn),與傳統(tǒng)的線程以及操作系統(tǒng)級別的線程(也稱為平臺線程)相比,它的創(chuàng)建開銷更小、資源利用率更高,是 Java 并發(fā)編程領(lǐng)域的一項(xiàng)重要創(chuàng)新。

PS:虛擬線程正式發(fā)布于 Java 長期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。

虛擬線程是一種在 Java 虛擬機(jī)(JVM)層面實(shí)現(xiàn)的邏輯線程,不直接和操作系統(tǒng)的物理線程一一對應(yīng),因此它可以減少上下文切換所帶來的性能開銷。

操作系統(tǒng)線程、普通線程(Java 線程)和虛擬線程的關(guān)系如下:

1.虛擬線程使用

虛擬線程的創(chuàng)建有以下 4 種方式:

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

具體使用如下。

1.1 startVirtualThread

創(chuàng)建虛擬線程,并直接啟動執(zhí)行任務(wù):

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

1.2 unstarted

只創(chuàng)建虛擬線程,但不直接啟動(創(chuàng)建之后通過 start 啟動):

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

1.3 factory

先創(chuàng)建虛擬線程工廠,然后再使用工廠創(chuàng)建虛擬線程,之后再調(diào)用 start() 方法進(jìn)行執(zhí)行:

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

1.4 newVirtualThreadPerTaskExecutor

創(chuàng)建虛擬線程池:

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

2.虛擬線程 VS 普通線程

虛擬線程和普通線程的區(qū)別主要體現(xiàn)在以下幾點(diǎn):

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

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

3.SpringBoot開啟虛擬線程

以最新版的 Spring Boot 3.x 為例,我們開啟虛擬線程很簡單,只需要在 Spring Boot 配置文件中設(shè)置“spring.threads.virtual.enabled”為“true”即可開啟,以 application.yml 為例,啟用虛擬線程配置如下:

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

這樣 Spinrg Boot 在啟動 Tomcat 容器時,會使用一個虛擬線程執(zhí)行器來代表原有的平臺線程池。

PS:這里是虛擬線程執(zhí)行器,不是虛擬線程池。

如果以上配置未生效的話,還可以通過修改 Tomcat 配置類,讓其使用虛擬線程來處理每一個請求,配置代碼如下:

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;

@Configuration
public class TomcatConfiguration {
    @Bean
    public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
        return protocolHandler -> {
            // 使用虛擬線程來處理每一個請求
            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
        };
    }
}

4.異步任務(wù)開啟虛擬線程

如果你想為 Spring Boot 中的異步任務(wù) @Async 也配置虛擬線程的話,可以在 AsyncConfigurer 配置類中設(shè)置,配置代碼如下:

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  // 開啟異步任務(wù)
public class AsyncTaskConfiguration implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        return new TaskExecutorAdapter(Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("virtual-async#", 1).factory()));
    }
}

最后

到此這篇關(guān)于SpringBoot開啟虛擬線程的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)SpringBoot虛擬線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud 如何提取公共配置

    SpringCloud 如何提取公共配置

    這篇文章主要介紹了SpringCloud 提取公共配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解在Java中如何創(chuàng)建多線程程序

    詳解在Java中如何創(chuàng)建多線程程序

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著在Java中如何創(chuàng)建多線程程序展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題

    SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題

    這篇文章主要介紹了SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java23種設(shè)計(jì)模式中的單例模式你了解嗎

    Java23種設(shè)計(jì)模式中的單例模式你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Java23種設(shè)計(jì)模式中的單例模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • JavaSe和JavaEE的區(qū)別原理面試題精講

    JavaSe和JavaEE的區(qū)別原理面試題精講

    這篇文章主要為大家介紹了JavaSe和JavaEE的區(qū)別原理面試題精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Idea 配置國內(nèi) Maven 源的圖文教程

    Idea 配置國內(nèi) Maven 源的圖文教程

    這篇文章主要介紹了Idea 配置國內(nèi) Maven 源的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-11-11
  • 學(xué)習(xí)Java九大內(nèi)置對象

    學(xué)習(xí)Java九大內(nèi)置對象

    學(xué)習(xí)Java九大內(nèi)置對象,從現(xiàn)在開始,希望大家可以通過這篇文章可以真正的理解Java九大內(nèi)置對象,感興趣的朋友可以參考一下
    2016-05-05
  • Java動態(tài)規(guī)劃篇之線性DP的示例詳解

    Java動態(tài)規(guī)劃篇之線性DP的示例詳解

    這篇文章主要通過幾個例題為大家詳細(xì)介紹一些Java動態(tài)規(guī)劃中的線性DP,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-11-11
  • Java中的隱式參數(shù)和顯示參數(shù)實(shí)例詳解

    Java中的隱式參數(shù)和顯示參數(shù)實(shí)例詳解

    這篇文章主要介紹了Java中的隱式參數(shù)和顯示參數(shù)是什么,另外還有兩個小例子幫助大家理解,需要的朋友可以參考下。
    2017-08-08
  • 簡單了解Spring Cloud Alibaba相關(guān)知識

    簡單了解Spring Cloud Alibaba相關(guān)知識

    這篇文章主要介紹了簡單了解Spring Cloud Alibaba相關(guān)知識,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

沈丘县| 青阳县| 柳州市| 荔浦县| 综艺| 津南区| 滦平县| 海南省| 论坛| 沙田区| 敖汉旗| 德清县| 嘉祥县| 汉源县| 德昌县| 定安县| 建湖县| 大宁县| 玛纳斯县| 焦作市| 惠州市| 南江县| 泰顺县| 巴楚县| 黄龙县| 拉萨市| 永吉县| 淳安县| 靖宇县| 贵港市| 芦溪县| 湄潭县| 阳城县| 灵台县| 南阳市| 岳普湖县| 金川县| 深州市| 兰考县| 巴塘县| 万全县|