偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

網(wǎng)易面試:SpringBoot如何開(kāi)啟虛擬線(xiàn)程?

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

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

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

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

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

1.虛擬線(xiàn)程使用

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

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

具體使用如下。

(1)startVirtualThread

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

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

(2)unstarted

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

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

(3)factory

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

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

(4)newVirtualThreadPerTaskExecutor

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

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

2.虛擬線(xiàn)程 VS 普通線(xiàn)程

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

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

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

3.SpringBoot開(kāi)啟虛擬線(xiàn)程

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

spring:
  threads:
    virtual:
      enabled: true # 啟用虛擬線(xiàn)程

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

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

如果以上配置未生效的話(huà),還可以通過(guò)修改 Tomcat 配置類(lèi),讓其使用虛擬線(xiàn)程來(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 -> {
            // 使用虛擬線(xiàn)程來(lái)處理每一個(gè)請(qǐng)求
            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
        };
    }
}

4.異步任務(wù)開(kāi)啟虛擬線(xiàn)程

如果你想為 Spring Boot 中的異步任務(wù) @Async 也配置虛擬線(xiàn)程的話(huà),可以在 AsyncConfigurer 配置類(lèi)中設(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  // 開(kāi)啟異步任務(wù)
public class AsyncTaskConfiguration implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        return new TaskExecutorAdapter(Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("virtual-async#", 1).factory()));
    }
}
責(zé)任編輯:姜華 來(lái)源: Java中文社群
相關(guān)推薦

2023-12-20 14:35:37

Java虛擬線(xiàn)程

2023-10-16 10:09:41

線(xiàn)程進(jìn)程

2025-06-09 09:57:16

2022-02-28 07:01:22

線(xiàn)程中斷interrupt

2014-12-16 12:54:09

BIOS虛擬化技術(shù)

2025-02-21 15:25:54

虛擬線(xiàn)程輕量級(jí)

2025-03-17 00:00:00

2024-03-18 14:06:00

停機(jī)Spring服務(wù)器

2024-09-11 22:51:19

線(xiàn)程通訊Object

2010-02-26 15:28:15

Python虛擬機(jī)

2016-12-16 16:07:37

網(wǎng)易云

2024-05-10 08:10:05

Spring虛擬線(xiàn)程JDK

2022-09-12 22:27:05

編程式事務(wù)聲明式事務(wù)對(duì)象

2024-01-19 14:03:59

Redis緩存系統(tǒng)Spring

2024-05-16 17:58:30

線(xiàn)程任務(wù)線(xiàn)程通訊線(xiàn)程池

2024-01-31 08:26:44

2024-09-09 15:09:30

2011-09-09 10:13:23

ubuntussh服務(wù)

2025-01-03 16:32:13

SpringBoot虛擬線(xiàn)程Java

2023-10-13 08:20:02

Spring線(xiàn)程池id
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)