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

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

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

引言

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

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

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

操作系統(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)建虛擬線程,并直接啟動(dòng)執(zhí)行任務(wù):

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

1.2 unstarted

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

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

2.虛擬線程 VS 普通線程

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

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

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

3.SpringBoot開啟虛擬線程

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

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

這樣 Spinrg Boot 在啟動(dòng) Tomcat 容器時(shí),會(huì)使用一個(gè)虛擬線程執(zhí)行器來(lái)代表原有的平臺(tái)線程池。

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

如果以上配置未生效的話,還可以通過(guò)修改 Tomcat 配置類,讓其使用虛擬線程來(lái)處理每一個(gè)請(qǐng)求,配置代碼如下:

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 -> {
            // 使用虛擬線程來(lái)處理每一個(gè)請(qǐng)求
            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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的兩種方法詳解

    Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的兩種方法詳解

    使用具將Excel轉(zhuǎn)為PDF的方法有很多,在這里我給大家介紹兩種常用的方法:使用spire轉(zhuǎn)化PDF、使用jacob實(shí)現(xiàn)Excel轉(zhuǎn)PDF,分別應(yīng)對(duì)兩種不一樣的使用場(chǎng)景,需要的可以參考一下
    2022-01-01
  • Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境全過(guò)程

    Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境全過(guò)程

    眾所周知Ubuntu是一種基于Linux的操作系統(tǒng),它提供了一個(gè)穩(wěn)定、安全和易于使用的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 解決Maven項(xiàng)目pom.xml文件Ignored的問(wèn)題

    解決Maven項(xiàng)目pom.xml文件Ignored的問(wèn)題

    在Maven項(xiàng)目中,若不慎刪除了.iml文件,可能會(huì)導(dǎo)致pom.xml文件顯示為Ignored狀態(tài),影響項(xiàng)目構(gòu)建,解決方法是通過(guò)IDEA的設(shè)置取消Ignored Files中對(duì)應(yīng)文件的忽略,再刷新Maven項(xiàng)目即可恢復(fù),此操作可有效解決pom.xml文件被誤忽略的問(wèn)題,保證項(xiàng)目正常構(gòu)建和運(yùn)行
    2024-09-09
  • Java通過(guò)Fork/Join優(yōu)化并行計(jì)算

    Java通過(guò)Fork/Join優(yōu)化并行計(jì)算

    這篇文章主要為大家詳細(xì)介紹了Java通過(guò)Fork、Join來(lái)優(yōu)化并行計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java實(shí)現(xiàn)HashMap排序方法的示例詳解

    Java實(shí)現(xiàn)HashMap排序方法的示例詳解

    這篇文章主要通過(guò)一些示例為大家介紹了Java對(duì)HashMap進(jìn)行排序的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解一下
    2022-05-05
  • SpringBoot實(shí)現(xiàn)文件記錄日志及日志文件自動(dòng)歸檔和壓縮

    SpringBoot實(shí)現(xiàn)文件記錄日志及日志文件自動(dòng)歸檔和壓縮

    Logback是Java日志框架,通過(guò)Logger收集日志并經(jīng)Appender輸出至控制臺(tái)、文件等,SpringBoot配置logback-spring.xml可實(shí)現(xiàn)日志文件存儲(chǔ),本文給大家介紹了SpringBoot實(shí)現(xiàn)文件記錄日志及日志文件自動(dòng)歸檔和壓縮,需要的朋友可以參考下
    2025-05-05
  • spring配置不掃描service層的原因解答

    spring配置不掃描service層的原因解答

    這篇文章主要介紹了spring配置不掃描service層的原因解答,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java的線程池框架及線程池的原理

    java的線程池框架及線程池的原理

    這篇文章主要介紹了java的線程池框架及線程池的原理的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解

    Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解

    這篇文章主要介紹了Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java date format時(shí)間格式化操作示例

    Java date format時(shí)間格式化操作示例

    這篇文章主要介紹了Java date format時(shí)間格式化操作,結(jié)合具體實(shí)例形式分析了java針對(duì)日期時(shí)間進(jìn)行格式化操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03

最新評(píng)論