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

Java21在spring boot中使用虛擬線程的方法

 更新時間:2025年08月23日 14:51:16   作者:不死的精靈  
本文給大家介紹Java21在spring boot中使用虛擬線程的方法,結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

前置知識

虛擬線程VT(Virtual Thread)

0.環(huán)境說明

用于驗證的版本:

spring boot 3.1中就支持使用jdk21的虛擬線程了,但是在spring boot 3.2中可以直接通過配置的方式開啟虛擬線程。不過本文編寫的時候spring boot 3.3.3已經(jīng)GA了,他在3.2的基礎上又對虛擬線程進行了進一步地適配,所以本文章中的版本為3.3

在spring boot 3.2.9中配置spring.threads.virtual.enabled=true即可啟用虛擬線程

1.原理解析

開啟了這個配置后,對我們的spring boot服務有什么影響呢?

我們在spring boot的源碼中搜索spring.threads.virtual.enabled即可看到這個配置在spring boot中生效在了什么地方。
首先我們可以看到如下的代碼(通過代碼注釋也能看出,這個配置就是在3.2.0引入的)

/**
 * Threading of the application.
 *
 * @author Moritz Halbritter
 * @since 3.2.0
 */
public enum Threading {
	/**
	 * Platform threads. Active if virtual threads are not active.
	 */
	PLATFORM {
		@Override
		public boolean isActive(Environment environment) {
			return !VIRTUAL.isActive(environment);
		}
	},
	/**
	 * Virtual threads. Active if {@code spring.threads.virtual.enabled} is {@code true}
	 * and running on Java 21 or later.
	 */
	VIRTUAL {
		@Override
		public boolean isActive(Environment environment) {
			return environment.getProperty("spring.threads.virtual.enabled", boolean.class, false)
					&& JavaVersion.getJavaVersion().isEqualOrNewerThan(JavaVersion.TWENTY_ONE);
		}
	};
	/**
	 * Determines whether the threading is active.
	 * @param environment the environment
	 * @return whether the threading is active
	 */
	public abstract boolean isActive(Environment environment);
}

接下來我們看一下VIRTUAL.isActive(environment)這個方法都用在了哪里(哪里用到了,就說明哪里的虛擬線程是通過這個配置生效的)

可以看到他被用在如下的地方:

  • spring-webflux(區(qū)別于spring web的一個響應式web開發(fā)框架)的阻塞配置中(如果阻塞了使用什么類型的線程去進行阻塞)
  • 注解ConditionalOnThreading的判斷條件OnThreadingCondition
    • Rabbit MQ——一個消息隊列,啟用虛擬線程則執(zhí)行configurer.setTaskExecutor(new VirtualThreadTaskExecutor("rabbit-direct-"));configurer.setTaskExecutor(new VirtualThreadTaskExecutor("rabbit-simple-"));
    • JedisConnection——一個redis客戶端,啟用虛擬線程則執(zhí)行
      SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-");
          executor.setVirtualThreads(true);
          factory.setExecutor(executor);
    • LettuceConnection——一個redis客戶端,啟用虛擬線程則執(zhí)行和Jedis類似的代碼,都是把Executor設置為一個啟用了虛擬線程的new SimpleAsyncTaskExecutor("redis-");
    • Kafka——一個消息隊列,啟用虛擬線程則執(zhí)行和Jedis類似的兩碼,把Executor設置為一個啟用了虛擬線程的new SimpleAsyncTaskExecutor("kafka-");
    • TaskExecutorConfigurations——spring boot中的任務調(diào)度器配置類,@Async(異步任務注解)所注解的方法會根據(jù)配置決定是用平臺線程執(zhí)行還是虛擬線程執(zhí)行
    • TaskSchedulingConfigurations——spring boot中定時任務配置類,@Scheduled(定時任務注解)所注解的方法會根據(jù)配置決定是用平臺線程執(zhí)行還是虛擬線程執(zhí)行
    • EmbeddedWebServerFactoryCustomizerAutoConfiguration——通常我們最關心的地方,這里定義了spring web的默認容器tomcat的線程配置(Jetty的工作線程配置也在一起),如果開啟了虛擬線程,則tomcat會使用虛擬線程作為執(zhí)行器(再也不用考慮tomcat默認200線程的問題了?。。。?/li>
  • Pulsar:一個分布式消息流平臺,啟用虛擬線程則執(zhí)行containerProperties.setConsumerTaskExecutor(new VirtualThreadTaskExecutor("pulsar-consumer-"));readerContainerProperties.setReaderTaskExecutor(new VirtualThreadTaskExecutor("pulsar-reader-"));

2.spring boot的方案

通過在spring boot的源碼搜索@ConditionalOnThreading(Threading.VIRTUAL),可以看到spring boot會根據(jù)虛擬線程的開啟與否來選擇注入不同的bean,我們以spring-data-redis為例,其具體代碼如下:

    @Bean
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	@ConditionalOnThreading(Threading.PLATFORM)
	LettuceConnectionFactory redisConnectionFactory(
			ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
			ClientResources clientResources) {
		return createConnectionFactory(builderCustomizers, clientResources);
	}
	@Bean
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	@ConditionalOnThreading(Threading.VIRTUAL)
	LettuceConnectionFactory redisConnectionFactoryVirtualThreads(
			ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
			ClientResources clientResources) {
		LettuceConnectionFactory factory = createConnectionFactory(builderCustomizers, clientResources);
		SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-");
		executor.setVirtualThreads(true);
		factory.setExecutor(executor);
		return factory;
	}

通過代碼不難看出,spring boot 3.2通過@ConditionalOnThreading注解的方式,實現(xiàn)了虛擬線程和平臺線程的動態(tài)配置。

如果我們自己需要開發(fā)一個能夠同時支持平臺線程和虛擬線程的sdk,可以復用這個注解。

3.注意事項(施工中,歡迎補充)

  • 使用虛擬線程本身要注意的5個點:
    1. 大方使用“一個請求一個線程”的開發(fā)方式
    2. 不需要對虛擬線程進行池化
    3. 使用信號量控制并發(fā)
    4. 慎用ThreadLocal,使用ScopeValue(java21中還是預覽狀態(tài))代替
    5. 使用ReturnLock替代synchronized(這個問題似乎在jdk23中會永久解決)
  • java21默認的垃圾回收器G1和其自身的JIT編譯器C2似乎有沖突,會導致jvm crash?(這里不能確定,似乎在高版本jdk 21.0.7中進行了修復,但是我比較了openjdk的源碼,并沒能找到具體的改動指向這個問題)

到此這篇關于Java21在spring boot中使用虛擬線程的方法的文章就介紹到這了,更多相關springboot使用虛擬線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Netty分布式固定長度解碼器實現(xiàn)原理剖析

    Netty分布式固定長度解碼器實現(xiàn)原理剖析

    這篇文章主要為大家介紹了Netty分布式固定長度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解

    Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解

    關于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結了如何注冊BeanPostProcessor,文中有非常詳細的圖文示例,需要的朋友可以參考下
    2021-06-06
  • 深入理解Java的Spring框架中的IOC容器

    深入理解Java的Spring框架中的IOC容器

    IOC(Inversion of Control,控制反轉)是Spring框架的核心,負責控制對象的生命周期與關系,接下來就讓我們跟隨文章來深入理解Java的Spring框架中的IOC容器:
    2016-07-07
  • 在springboot中攔截器Filter中注入bean失敗問題及解決

    在springboot中攔截器Filter中注入bean失敗問題及解決

    這篇文章主要介紹了在springboot中攔截器Filter中注入bean失敗問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring @Value的注解使用和原理解析

    Spring @Value的注解使用和原理解析

    @Value注解在Spring開發(fā)中是一個使用很頻繁的注解,在項目開發(fā)中,我們通常需要讀取配置文件中的一些信息,當然,@Value不單單能讀取配置文件,還能讀取系統(tǒng)屬性,還可以讀取其他bean的屬性,本章就來詳細介紹@Value注解的使用和對源碼進行分析
    2023-06-06
  • spring?boot寫java?web和接口

    spring?boot寫java?web和接口

    這篇文章主要介紹了spring?boot寫java?web和接口,Spring?Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程,該框架使用了特定的方式來進行配置,從而使開發(fā)人員不再需要定義樣板化的配置,下面詳細內(nèi)容需要的小伙伴可以參考一下
    2022-01-01
  • 淺談Spring中@Import注解的作用和使用

    淺談Spring中@Import注解的作用和使用

    這篇文章主要介紹了淺談Spring中@Import注解的作用和使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • jvm調(diào)優(yōu)的幾種場景(小結)

    jvm調(diào)優(yōu)的幾種場景(小結)

    本文主要介紹了jvm調(diào)優(yōu)的幾種場景,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java新手教程之ArrayList的基本使用

    Java新手教程之ArrayList的基本使用

    ArrayList就是傳說中的動態(tài)數(shù)組,用MSDN中的說法,就是Array的復雜版本,這篇文章主要給大家介紹了關于Java新手教程之ArrayList基本使用的相關資料
    2021-06-06
  • AsyncHttpClient IOExceptionFilter異常過濾器

    AsyncHttpClient IOExceptionFilter異常過濾器

    這篇文章主要為大家介紹了AsyncHttpClient IOExceptionFilter異常過濾器代碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論

临湘市| 阿坝| 蛟河市| 伽师县| 江都市| 收藏| 潜山县| 彭州市| 临洮县| 来凤县| 沙河市| 个旧市| 合作市| 彩票| 麟游县| 油尖旺区| 高要市| 鲁山县| 广元市| 亳州市| 张家界市| 深州市| 宜春市| 新余市| 荆门市| 方城县| 高青县| 运城市| 宁南县| 绵竹市| 师宗县| 莱芜市| 涿鹿县| 龙陵县| 博爱县| 兴化市| 全州县| 松阳县| 梁平县| 古蔺县| 措美县|