5分钟带您快速了解Java19新特性:虚拟线程,倍儿爽!

举报
wljslmz 发表于 2022/12/12 20:48:58 2022/12/12
【摘要】 本文给大家介绍了java19的虚拟线程,主要内容有:为啥需要虚拟线程?什么是虚拟线程?如何使用虚拟线程?希望本文对您有所帮助,有任何问题欢迎在下方评论区与我讨论!

我们都知道2022 年 9 月 20 日Java圈发生了一件大事,那就是Java 19发布了,你可以在以下网址中下载Java19:

https://jdk.java.net/19/

对于我来说,最令我感兴趣的新特性当然还是虚拟线程,它已经在Project Loom中开发了几年,现在终于作为预览包含在 JDK 中。

本文,我们就重点介绍Java 19的绝杀新特性:虚拟线程,我会给出具体的例子。

虚拟线程

为什么需要虚拟线程?

作为Java程序员,大家都知道线程是后端应用的瓶颈,对于每个传入请求,都需要一个线程来处理该请求。一个 Java 线程对应一个操作系统线程,它们非常耗费资源,假如有成百上千万的线程同时工作,可见系统的负担得有多重。

有人会说了,几百个、几千个甚至几万个线程也没啥呀,这么点资源难道JVM都搞不定嘛?那你想想那些需要等待阻塞数据结构(例如队列、锁或数据库、微服务或云 API 等外部服务)而需要更长的时间来处理的请求,想想它们相当于是多少线程在工作呢?

例如,如果一个请求需要两秒钟,我们将线程池限制为 100 个线程,那么每秒最多可以响应 50 个请求。然而,CPU 将远未被利用,因为它会花费大部分时间等待来自外部服务的响应,即使每个 CPU 内核提供多个线程也是如此。

没有虚拟线程之前,我们只能通过RxJava和Project Reactor等框架提供的响应式编程来解决这个问题。但是写过这两个程序的人都知道其代码的编写有多么的复杂和不易维护。

因此虚拟线程就派上用场了。

什么是虚拟线程?

虚拟线程是更高级别的构造,旨在提供 Java 中用户模式线程的功能。

线程池引入的跨任务“线程共享”的想法可能有助于提高吞吐量,但与“每个请求一个线程”风格相比,它可能有明显的缺点。“ thread-per-request ”的思想允许代码可维护、可理解和可调试,这种风格使得开发者可以从头到尾执行和观察任务。

虚拟线程的目标是保持“thread-per-request”风格,使代码执行清晰并保持可理解的线程结构。虚拟线程是共享的(非 CPU 绑定)并跨平台线程。因此,用户不得对其分配给平台线程做出任何假设,虚拟线程非常轻量。

虚拟线程在操作系统进程和应用程序级并发之间创建了一个抽象层。换句话说,可以使用虚拟线程来调度由Java虚拟机协调的任务,而JVM充当操作系统和程序之间的中介。下图展示了虚拟线程的架构:

虚拟线程写法示例

以下是虚拟线程写法示例:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 999999).forEach(i -> executor.submit(() -> { 
        Thread.sleep(Duration.ofSeconds(1));
        System.out.println(i);
        return i;
    }));
}

核心代码就是Executors.newVirtualThreadPerTaskExecutor()

怎么样?是不是有种快点想试试的冲动?

总结

本文给大家介绍了java19的虚拟线程,主要内容有:为啥需要虚拟线程?什么是虚拟线程?如何使用虚拟线程?希望本文对您有所帮助,有任何问题欢迎在下方评论区与我讨论!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。