专业的JAVA编程教程与资源

网站首页 > java教程 正文

面试官问,JAVA虚拟线程了解吗?

temp10 2025-05-30 17:25:07 java教程 5 ℃ 0 评论

#头条创作挑战赛#

前言

最近面试官问,JAVA虚拟线程你了解吗?你只听说过线程,竟还有虚拟线程这回事?

面试官问,JAVA虚拟线程了解吗?

Java 虚拟线程是 JDK 19 中引入的一项新功能。它有可能在减少内存消耗的基础上提高应用程序的可用性、吞吐量,那么本文就带大家了解一下JAVA虚拟线程究竟是怎么样一回事。

线程生命周期

我们先来回顾下线程在线程池中的整个生命周期吧,如下图所示:

  1. 线程在线程池中创建
  2. 线程在池中等待新请求的到来
  3. 一旦新的请求到来,线程接收请求并调用后端数据库来处理这个请求。
  4. 线程等待后端数据库的响应
  5. 一旦响应从数据库返回,线程处理它,并将响应发送回客户
  6. 线程返回线程池

步骤 #2 到 #6 将不断重复,直到应用程序关闭。

你会发现线程实际上只在步骤#3 和#5 中进行实际工作。在所有其他步骤(即步骤#1、步骤#2、步骤#4、步骤#6)中,它基本上是在等待(或什么都不做)。在大多数应用程序中,大量线程在其生命周期的大部分时间里都处于等待状态

平台线程架构

我们在来看看Linux系统中线程的架构,平台应用中的线程都映射到一个操作系统线程,如下图所示:

在之前的JVM(Java Virtual Machine)版本中,只有一种线程。它被称为“经典”或“平台”线程。每当创建平台线程时,都会为其分配一个操作系统线程。只有当平台线程退出(即死亡)JVM 时,该操作系统线程才可以执行其他任务。在此之前,它无法执行任何其他任务。基本上,平台线程和操作系统线程之间存在 1:1 的映射。

根据这种架构,操作系统线程将在平添的线程生命周期的步骤#1、步骤#2、步骤#4、步骤#6 中被不必要地锁定,即使这时候线程没有做任何工作,只是傻傻地等待在那。由于操作系统中的线程是宝贵且有限的资源,因此在该平台线程架构中大量浪费了时间。

虚拟线程架构

我们现在看看虚拟线程的架构,是如何处理上面所说的问题的呢?实际上,在虚拟线程架构下,操作系统线程不会一开始就分配给平台线程,而是直到需要执行实际工作时,如下图所示:

为了高效地使用底层操作系统线程,在 JDK 19 中引入了虚拟线程。在这种新架构中,虚拟线程只有在执行实际工作时才会分配给平台线程。根据上述线程的生命周期,只有在步骤#3 和步骤#5 期间,虚拟线程才会分配给平台线程(反过来使用操作系统线程)执行。在所有其他步骤中,虚拟线程将作为对象驻留在 Java 堆内存区域中,就像其他的普通对象一样。所以说,虚拟线程是很轻量级且高效。


如何创建虚拟线程?

我们现在看看如何创建一个虚拟线程,代码如下:

Runnable task = () -> { System.out.println("Hello Virtual Thread!"); };

Thread.startVirtualThread(task);
  • 通过Thread.startVirtualThread() 可以快速创建出虚拟线程

另外,还可以使用以下 API 创建 Java 虚拟线程:

1. Thread.ofVirtual().start(Runnable);

2. Thread.ofVirtual().unstarted(Runnable);

3. Executors.newVirtualThreadPerTaskExecutor();

4. Executors.newThreadPerTaskExecutor(ThreadFactory);

虚拟线程的优点

由于其优雅的架构,虚拟线程提供了几个优点:

  1. 提高应用可用性
  2. 提高应用吞吐量
  3. 减少出现这样的一次'OutOfMemoryError: unable to create new native thread'
  4. 减少应用程序内存消耗

虚拟线程的缺点

  • 虚拟线程默认是守护线程,截至目前,设置Thread.setPriority(int)没有任何效果,但可能会在 JDK 的更高版本中发生变化。
  • 虚拟线程不支持stop()、suspend()或resume()方法,如果调用它们会抛出异常。

总结

本文讲解了虚拟线程是什么,以及如何工作的。那它究竟适合于什么样的一个场景呢?当有大量不受 CPU 限制的任务时,虚拟线程有助于提高吞吐量。I/O 密集型任务是受益于虚拟线程的主要任务,这些任务包括从队列中读取数据、等待传入的 Web 请求、数据库查询等。


欢迎关注个人公众号【JAVA旭阳】交流学习!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表