h5婚纱摄影网站模板中国制造网外贸平台怎么注册
h5婚纱摄影网站模板,中国制造网外贸平台怎么注册,福州模板建站定制网站,品牌建站什么是虚拟线程
虚拟线程是Java19开始增加的一个特性#xff0c;和Golang的携程类似#xff0c;一个其它语言早就提供的、且如此实用且好用的功能#xff0c;作为一个Java开发者#xff0c;早就已经望眼欲穿了。
虚拟线程和普通线程的区别
“虚拟”线程#xff0c;望文…什么是虚拟线程虚拟线程是Java19开始增加的一个特性和Golang的携程类似一个其它语言早就提供的、且如此实用且好用的功能作为一个Java开发者早就已经望眼欲穿了。虚拟线程和普通线程的区别“虚拟”线程望文生义它是“假”的它不直接调度操作系统的线程而是由JVM再提供一层线程的接口抽象由普通线程调度即一个普通的操作系统线程可以调度成千上万个虚拟线程。虚拟线程比普通线程的消耗要小得多得多在内存足够的情况下我们甚至可以创建上百万的虚拟线程这在之前(Java19以前)是不可能的。❝其实如果有用过akka的朋友们会发现其实两者很相似只不过使用akka是应用程序来处理而虚拟线程是JVM来处理使用上更简洁且方便。❞SpringBoot使用虚拟线程下面我们会在SpringBoot中使用虚拟线程将默认的异步线程池和http处理线程池替换为虚拟线程然后对比虚拟线程和普通线程的性能差异你会发现差别就像马车换高铁不是一个时代的东西。配置首先我们使用的Java版本是java-20.0.2-oracleSpringBoot版本是3.1.2。要在SpringBoot中使用虚拟线程很简单增加如下配置即可/** * 配置是用于稍后测试spring.virtual-threadtrue是使用虚拟线程false时还是使用默认的普通线程 */ Configuration ConditionalOnProperty(prefix spring, name virtual-thread, havingValue true) publicclass ThreadConfig { Bean public AsyncTaskExecutor applicationTaskExecutor() { returnnew TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor()); } Bean public TomcatProtocolHandlerCustomizer? protocolHandlerCustomizer() { return protocolHandler - { protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); }; } }Async性能对比我们写一个异步service里面睡眠50ms模拟MySQL或Redis等IO操作Service public class AsyncService { /** * * param countDownLatch 用于测试 */ Async public 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秒!!朋友们接近200倍的性能差距HTTP请求性能对比让我们再看看http请求的对比简单写个get请求里面什么也不做一样睡50ms模拟IO操作RequestMapping(/get) public Object get() throws Exception { Thread.sleep(50); return ok; }然后我们使用jmeter请求接口500个并发线程运行1万次看看效果如何「普通线程」可以看到最小用时50ms这个没毛病接口里面睡眠了50ms但是不管是中位数还是90/95/99线都大于150ms了这是因为系统线程是一个很昂贵的资源SpringBoot中tomcat默认的最大连接数应该是200在连接池的线程被耗尽后这200个线程在那干等50ms结束而剩下的请求也只能等待无法进行其它的操作。下面再看下虚拟线程的表现「虚拟线程耗时」可以看到即使是最大耗时也保持在100ms以下即线程等待时间显著的减少虚拟线程更好的利用了系统资源。总结从上面的性能对比来看虚拟线程在性能方面有明显的优势但是要注意的是我们上面的测试都是让线程等待了50ms这是模拟什么场景没错是IO密集型场景即线程大部分时间是在等待IO这样虚拟线程才可以发挥出它的优势如果是CPU密集型场景那么可能效果并不大。不过我们目前大部分的应用都是IO密集型应用较多比如典型的WEB应用大量的时间在等待网络IODB、缓存、HTTP等等使用虚拟线程的效果还是非常明显的。❝最后大部分的公司可能还在用Java8但是我想说的是是时候升级了跟上时代的脚步吧朋友们❞