JDK21中虚拟线程到底是什么?看完便知

这篇具有很好参考价值的文章主要介绍了JDK21中虚拟线程到底是什么?看完便知。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文涉及到的技术:虚拟线程、结构化并发、线程池、TheadLocal,对原理感兴趣的可以直接跳到原理部分。

虚拟线程是JDK19中引入的,JDK21正式发布,我们先来看看虚拟线程的几种用法,然后再来分析底层实现原理。

先定义一个Runnable:
JDK21中虚拟线程到底是什么?看完便知,java

通过观察输出结果,就能知道当前运行Task的是不是虚拟线程

也可以增加以下代码直接判断是不是虚拟线程:
JDK21中虚拟线程到底是什么?看完便知,java

Thread.ofVirtual()

手动开启虚拟线程执行任务:
JDK21中虚拟线程到底是什么?看完便知,java
自动开启虚拟线程执行任务:
JDK21中虚拟线程到底是什么?看完便知,java

两者输出结果类似,为:

JDK21中虚拟线程到底是什么?看完便知,java
根据名字可以看出确实是用的VirtualThread,但似乎跟ForkJoinPool有关,后面会分析。

我们也可以通过以下方式来创建普通线程

JDK21中虚拟线程到底是什么?看完便知,java

输出结果为:

JDK21中虚拟线程到底是什么?看完便知,java
确实是普通线程。

还可以先得到一个ThreadFactory,然后来创建虚拟线程:

JDK21中虚拟线程到底是什么?看完便知,java
输出结果为:

JDK21中虚拟线程到底是什么?看完便知,java

还有一种更简单的API:

JDK21中虚拟线程到底是什么?看完便知,java
输出结果为:

JDK21中虚拟线程到底是什么?看完便知,java

结构化并发

在JDK21中还有一个新特性(预览版),叫做结构化并发,也会自动创建虚拟线程来运行代码,比如:

JDK21中虚拟线程到底是什么?看完便知,java
输出结果为:

JDK21中虚拟线程到底是什么?看完便知,java

Executors

还有一种和线程池类似的使用方式:

JDK21中虚拟线程到底是什么?看完便知,java
以上代码中每个任务运行时都会开启一个虚拟线程,输出�结果为:

JDK21中虚拟线程到底是什么?看完便知,java
表示有3个虚拟线程。

虚拟线程底层原理

以上大概就是使用或创建虚拟线程的几种情况了,那到底什么是虚拟线程呢?它跟线程有什么关系?它跟ForkJoinPool又有什么关系呢?

虚拟线程毕竟是虚拟的,就像虚拟机也是虚拟的,是需要真实操作系统来支撑运行的。而虚拟线程仍然是基于线程来进行调度执行的

我们先来看看普通线程的缺点在哪,看下面代码:

JDK21中虚拟线程到底是什么?看完便知,java
假如是一个普通线程执行上述代码,在输出完“before”后,线程就会睡眠1秒,然后才会输出“after”,如果是一个线程要执行3个这样的任务,比如:

JDK21中虚拟线程到底是什么?看完便知,java
生成一个只有一个线程的线程池,用它来执行三个任务,实际上就是串行执行这三个任务,输出结果为:

JDK21中虚拟线程到底是什么?看完便知,java

但是,我们好好想想:当这个普通线程执行完第一个任务的“before”后,需要等1s才执行“after”,那能不能在等1s的过程中去执行第二个任务的“before”呢?原则上是可以的,这就是虚拟线程要优化的点。

大家好好理解一下上面的这句话,这是精髓

我们来看改成虚拟线程后的运行效果,先修改Task:

JDK21中虚拟线程到底是什么?看完便知,java

然后运行:

JDK21中虚拟线程到底是什么?看完便知,java

输出结果为:

JDK21中虚拟线程到底是什么?看完便知,java

大家运行时可能会发现有多个不同的ForkJoinPool-1-worker,那是因为我做了配置,后面会解释

不知道大家能不能看懂这个效果,我们可以发现有3个虚拟线程:VirtualThread[#21]VirtualThread[#23]VirtualThread[#24],但是只有一个线程:ForkJoinPool-1-worker-1,虽然只有一个线程,却达到了并行执行三个任务的效果,其原理就是上面所分析的:

  1. 线程先执行任务1,任务1睡眠的过程中,线程会去执行任务2
  2. 任务2睡眠的过程中,线程会去执行任务3
  3. 任务3睡眠的过程中,线程暂时没有任务执行了
  4. 过一会,任务1睡眠结束,线程继续执行任务1
  5. 然后,任务2睡眠结束,线程继续执行任务2
  6. 最后,任务3睡眠结束,线程继续执行任务3

这样就达到了一个线程并行执行三个任务的效果,从中,我们可以看到,线程需要知道:一个任务什么时候开始睡眠了,什么时候睡眠结束了,哪个任务还没开始执行,哪个任务已经在执行中了?

但是,任务是程序员所定义的,所以就需要虚拟线程来封装任务,而线程只关心虚拟线程即可,也就是线程负责来调度各个虚拟线程的执行,也就是来判断虚拟线程是不是睡眠了?是不是正在运行?

我们可以把虚拟线程理解为一个对象,这个虚拟线程对象有几种状态,比如是不是睡眠中,是不是运行中,而一个线程可以支持同时运行多个虚拟线程对象,当线程发现某个虚拟线程对象睡眠时,就会去运行其他的虚拟线程对象。

或者这么说:虚拟线程sleep了,底层的线程并不一定sleep了

所以,虚拟线程就是线程调度的单位,一个线程可以调度很多个虚拟线程,如果有多个线程,那当然就能调度更多虚拟线程了,所以在JDK的实现中,使用ForkJoinPool来提供线程作为虚拟线程的调度者,同时由于ForkJoinPool的任务窃取机制,能进一步提高任务并行执行的效率。

默认情况下,这个ForkJoinPool中的线程数等于CPU核心数,我们可以通过以下参数来修改:

  • -Djdk.virtualThreadScheduler.parallelism=1
  • -Djdk.virtualThreadScheduler.maxPoolSize=1

另外,虚拟线程也不用考虑池化,因为它不像线程,开启和关闭一个线程是需要调用操作系统的,而虚拟线程跟操作系统没关系。

再另外,JDK21中的虚拟线程也支持ThreadLocal,也就是一个虚拟线程在执行任务的过程中,也可以通过ThreadLocal来共享数据,使得我们在开发过程中就把虚拟线程当作普通线程使用就可以了

还有要注意的是,当任务进行网络IO、磁盘IO时也相当是sleep了,所以如果虚拟线程用到真实项目中,就能做到用少量线程支撑较高的并发,从而能大大提高项目的吞吐量,虚拟线程不是用来提速的,而是用来提高吞吐量的

好了,看到这里,你是不是对JDK21中的虚拟线程又有了新的理解呢?如果有,我需要正反馈,一定要帮我点赞、收藏、分享哦!

广告

我准备运营自己的知识星球啦,知识星球以免费答疑、优化简历、讨论技术为主,另外还能帮助大家提升工作效率快速拿到offer认识更多大牛学习更多技术。

前50名小伙伴,可以免费加入星球,私信我领取免费链接!
JDK21中虚拟线程到底是什么?看完便知,java

如果您愿意直接付费加入,那当然也是可以的啦

JDK21中虚拟线程到底是什么?看完便知,java文章来源地址https://www.toymoban.com/news/detail-721084.html

到了这里,关于JDK21中虚拟线程到底是什么?看完便知的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jdk21 虚拟线程原理及使用分享

    jdk21已于北京时间9月19日21点正式发布, 其中引人注目的就是虚拟线程(Virtual Thread)随之正式发布, 不再是此前jdk19、jdk20中的预览版本。 平台线程 :java传统的线程是对系统线程的包装,为了区别于虚拟线程,因此将通过传统方式实现的线程叫做平台线程(Platform Thread) 虚拟线程

    2024年02月04日
    浏览(40)
  • JDK21最终版协程实现之虚拟线程

    JDK9 后的版本你觉得没必要折腾,我也认可,但是JDK21有必要关注。因为 JDK21 引入全新的并发编程模式。 一直沽名钓誉的GoLang吹得最厉害的就是协程了。JDK21 中就在这方面做了很大的改进,让Java并发编程变得更简单一点,更丝滑一点。 之前写过JDK21 Feature。 Virtual Threads 、

    2024年02月08日
    浏览(62)
  • 响应式编程又变天了?看JDK21虚拟线程如何颠覆!

    本文解释为啥会有响应式编程,为什么它在开发者中不太受欢迎,以及引入 Java 虚拟线程后它可能最终会消失。 命令式风格编程一直深受开发者喜爱,如 if-then-else、while 循环、函数和代码块等结构使代码易理解、调试,异常易追踪。然而,像所有好的东西一样,通常也有问

    2024年02月05日
    浏览(38)
  • JDK 21预告:虚拟线程正式发布及十多项新特性

    Java 21进入发布候选阶段,其中包括15个最终特性,包括虚拟线程、分代Z垃圾收集器和密钥封装机制API。 JDK21计划于9月19日作为Oracle标准Java实现的下一个LTS版本发布,已进入发布候选(RC)阶段。Java 21将具有15个新特性,之前提议的第16个特性实验性Shenandoah垃圾收集器已在6月被舍

    2024年02月10日
    浏览(46)
  • 再见了Future,图解JDK21虚拟线程的结构化并发

    Java为我们提供了许多启动线程和管理线程的方法。在本文中,我们将介绍一些在Java中进行并发编程的选项。我们将介绍 结构化并发 的概念,然后讨论 Java 21 中一组预览类——它使将任务拆分为子任务、收集结果并对其进行操作变得非常容易,而且不会不小心留下任何挂起的

    2024年02月05日
    浏览(57)
  • Java21虚拟线程实践

      就在前几天,java21正式版发布了,作为继java17之后的又一个长期支持版本 (LTS),为我们带来了很多新的特性,其中我最感兴趣的就是虚拟线程(virtual thread),相信大家对虚拟线程也很好奇。趁着空闲时间安装了jdk21来体验一把,顺便把我查到的关于java21虚拟线程相关的资料

    2024年02月08日
    浏览(44)
  • Java 21 虚拟线程:使用指南(一)

    虚拟线程是由 Java 21 版本中实现的一种轻量级线程。它由 JVM 进行创建以及管理。虚拟线程和传统线程(我们称之为平台线程)之间的主要区别在于,我们可以轻松地在一个 Java 程序中运行大量、甚至数百万个虚拟线程。 由于虚拟线程的数量众多,也就赋予了 Java 程序强大的

    2024年02月04日
    浏览(45)
  • Java 21新特性-虚拟线程 审核中

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@benweidig/looking-at-java-21-virtual-threads-0ddda4ac1be1 Java 21 版本更新中最重要的功能之一就是虚拟线程 (JEP 444)。这些轻量级线程减少了编写、维护和观察高吞吐量并发应用程序所需的工作量。 正如我的许多其他文章一样,在推出

    2024年02月08日
    浏览(56)
  • Java21上手体验-分代ZGC和虚拟线程

    几天前Oracle刚刚发布了Java21, 由于这是最新的LTS版本,引起了大家的关注。 我也第一时间在个人项目中进行了升级体验。 一探究竟,和大家分享。 https://jdk.java.net/21/release-notes https://my.oschina.net/waylau/blog/10112170 JEP 431:序列集合 JEP 439:分代 ZGC JEP 440:记录模式 JEP 441:switc

    2024年02月08日
    浏览(38)
  • Java 21 新特性:虚拟线程(Virtual Threads)

    在Java 21中,引入了虚拟线程(Virtual Threads)来简化和增强并发性,这使得在Java中编程并发程序更容易、更高效。 虚拟线程,也称为“用户模式线程(user-mode threads)”或“纤程(fibers)”。该功能旨在简化并发编程并提供更好的可扩展性。虚拟线程是轻量级的,这意味着它

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包