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

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

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

前置知識(shí)

虛擬線程VT(Virtual Thread)

0.環(huán)境說(shuō)明

用于驗(yàn)證的版本:

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

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

1.原理解析

開(kāi)啟了這個(gè)配置后,對(duì)我們的spring boot服務(wù)有什么影響呢?

我們?cè)趕pring boot的源碼中搜索spring.threads.virtual.enabled即可看到這個(gè)配置在spring boot中生效在了什么地方。
首先我們可以看到如下的代碼(通過(guò)代碼注釋也能看出,這個(gè)配置就是在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);
}

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

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

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

2.spring boot的方案

通過(guò)在spring boot的源碼搜索@ConditionalOnThreading(Threading.VIRTUAL),可以看到spring boot會(huì)根據(jù)虛擬線程的開(kāi)啟與否來(lái)選擇注入不同的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;
	}

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

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

3.注意事項(xiàng)(施工中,歡迎補(bǔ)充)

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

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

相關(guān)文章

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

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

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

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

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

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

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

    在springboot中攔截器Filter中注入bean失敗問(wèn)題及解決

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

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

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

    spring?boot寫(xiě)java?web和接口

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

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

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

    jvm調(diào)優(yōu)的幾種場(chǎng)景(小結(jié))

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

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

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

    AsyncHttpClient IOExceptionFilter異常過(guò)濾器

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

最新評(píng)論

台山市| 斗六市| 灵石县| 珠海市| 宜春市| 紫金县| 永定县| 兰考县| 阿图什市| 城市| 莆田市| 淮北市| 涿州市| 扬中市| 华宁县| 叶城县| 丘北县| 莲花县| 张家口市| 米林县| 桐乡市| 政和县| 汉沽区| 齐齐哈尔市| 正阳县| 丰都县| 潜山县| 嘉义市| 区。| 哈密市| 雷山县| 大姚县| 龙州县| 汝州市| 邵东县| 宁安市| 河北省| 合阳县| 鹿邑县| 额济纳旗| 同江市|