0Pricing
Java Academy · 课时

什么是虚拟线程

Java 21 中的轻量级线程

什么是虚拟线程 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

欢迎使用虚拟线程

虚拟线程在 Java 21 中作为最终特性推出(JEP 444)。它们由 JVM 而不是操作系统管理,是一种轻量级线程。

目标很简单:让您能够编写直观的每个请求一个线程代码,同时仍可扩展到数百万个并发任务。

旧问题

传统的平台线程与 OS 线程一一对应。每个线程大约消耗一 MB 的栈空间,创建成本也很高。

这意味着您一次只能运行几千个线程。阻塞式 I/O 会在等待期间占用整个 OS 线程。

虚拟线程有何不同

虚拟线程不独占 OS 线程。许多虚拟线程会多路复用到少量承载平台线程上。

  • 创建成本低(每毫秒可创建数千个)
  • 内存占用极小
  • 阻塞操作只会暂停虚拟线程,并释放承载线程

挂载与卸载

虚拟线程运行时,会挂载到承载线程上。当它遇到阻塞操作时,会卸载并释放承载线程,让其他工作得以继续。

这种暂停与恢复会自动进行。您的代码读起来就像普通的阻塞式代码。

第一个虚拟线程

下面是最简单的示例。Thread.ofVirtual().start(...) 会启动一个虚拟线程,而 join() 会等待它完成。

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual().start(() ->
            System.out.println("Hello from a virtual thread!"));
        vt.join();
        System.out.println("Main is done.");
    }
}

确认它是虚拟线程

每个 Thread 都提供 isVirtual()。您可以用它验证代码运行在哪种线程上。

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual().start(() -> {
            System.out.println("isVirtual: " + Thread.currentThread().isVirtual());
        });
        vt.join();
    }
}

扩展到大量任务

由于虚拟线程开销很低,启动数万个虚拟线程完全正常。这里我们会启动 10,000 个虚拟线程。

import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger counter = new AtomicInteger();
        Thread[] threads = new Thread[10_000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = Thread.ofVirtual().start(counter::incrementAndGet);
        }
        for (Thread t : threads) t.join();
        System.out.println("Completed: " + counter.get());
    }
}

为虚拟线程命名

您可以在启动虚拟线程之前使用构建器为其命名,从而更容易进行调试。

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual()
                .name("worker-1")
                .start(() ->
                    System.out.println("Running on: " + Thread.currentThread().getName()));
        vt.join();
    }
}

相同 API,全新引擎

虚拟线程实现了您已经熟悉的完全相同的 Thread API。您仍然使用 start、join、sleep 和 interrupt。

这意味着基于 Thread 和 Runnable 构建的现有库无需修改即可运行。

何时使用它们

虚拟线程非常适合输入输出密集型工作负载:网络服务器、数据库调用、远程应用程序接口请求。

它们在 CPU 密集型数值计算中并不会更快。在这种情况下,您仍然会受到处理器核心数的限制。

不要使用线程池

一个关键的思维转变是:不要把虚拟线程放入线程池。应为每个任务创建一个新线程,任务完成后让它结束。

线程池的存在是为了复用昂贵的资源。虚拟线程开销很低,因此将它们放入线程池是一种反模式。

快速检验

检验您对虚拟线程的理解。

回顾

您已经了解了虚拟线程是什么,以及它们为何重要:

  • 轻量级、由 JVM 管理,并在 Java 21 中正式定型
  • 通过挂载和卸载多路复用到载体线程上
  • 非常适合高并发的输入输出密集型工作
  • 使用相同的 Thread 接口,但按任务创建,而不是放入线程池

接下来您将学习创建虚拟线程的不同方式。

常见问题解答

「什么是虚拟线程」课时是免费的吗?

是的 — 「什么是虚拟线程」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「什么是虚拟线程」这节课中我会学到什么?

Java 21 中的轻量级线程 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「什么是虚拟线程」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是虚拟线程
  2. 创建虚拟线程
  3. 平台线程与虚拟线程
  4. 陷阱:固定与 ThreadLocals
← 返回 Java Academy