常用网站推广方式有哪些,微网站如何做微信支付宝支付宝支付接口,焦作搜索引擎优化,seo软件优化一、什么是虚拟线程
虚拟线程是Java19开始增加的一个特性#xff0c;和Golang的携程类似#xff0c;一个其它语言早就提供的、且如此实用且好用的功能#xff0c;作为一个Java开发者#xff0c;早就已经望眼欲穿了。
二、虚拟线程和普通线程的区别
“虚拟”线程#xf…一、什么是虚拟线程
虚拟线程是Java19开始增加的一个特性和Golang的携程类似一个其它语言早就提供的、且如此实用且好用的功能作为一个Java开发者早就已经望眼欲穿了。
二、虚拟线程和普通线程的区别
“虚拟”线程望文生义它是“假”的它不直接调度操作系统的线程而是由JVM再提供一层线程的接口抽象由普通线程调度即一个普通的操作系统线程可以调度成千上万个虚拟线程。
虚拟线程比普通线程的消耗要小得多得多在内存足够的情况下我们甚至可以创建上百万的虚拟线程这在之前(Java19以前)是不可能的。
三、SpringBoot使用虚拟线程
配置
首先我们使用的Java版本是java-20.0.2-oracleSpringBoot版本是3.1.2。
要在SpringBoot中使用虚拟线程很简单增加如下配置即可
/*** 配置是用于稍后测试spring.virtual-threadtrue是使用虚拟线程false时还是使用默认的普通线程*/
Configuration
ConditionalOnProperty(prefix spring, name virtual-thread, havingValue true)
public class ThreadConfig {Beanpublic AsyncTaskExecutor applicationTaskExecutor() {return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());}Beanpublic TomcatProtocolHandlerCustomizer? protocolHandlerCustomizer() {return protocolHandler - {protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());};}
}Async性能对比 我们写一个异步service里面睡眠50ms模拟MySQL或Redis等IO操作
Service
public class AsyncService {/*** * param countDownLatch 用于测试*/Asyncpublic void doSomething(CountDownLatch countDownLatch) throws InterruptedException {Thread.sleep(50);countDownLatch.countDown();}
}最后测试类很简单就是循环调用这个方法10万次计算所有方法执行完成的消耗的时间
Test
public void testAsync() throws InterruptedException {long start System.currentTimeMillis();int n 100000;CountDownLatch countDownLatch new CountDownLatch(n);for (int i 0; i n; i) {asyncService.doSomething(countDownLatch);}countDownLatch.await();long end System.currentTimeMillis();System.out.println(耗时 (end - start) ms);
}
普通线程耗时678秒左右超过10分钟了虚拟线程耗时3.9秒!!