简单聊聊JDK 21的虚拟线程

在 JDK 21 中,虚拟线程(Project Loom 的一部分)旨在提供一种轻量级的并发机制,通过更少的资源消耗来实现大量并发任务的处理。这里是一个简单的虚拟线程使用示例:

java 复制代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class VirtualThreadExample {
    public static void main(String[] args) {
        // 创建一个虚拟线程的 ExecutorService
        ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();

        // 提交一个任务到虚拟线程
        executor.submit(() -> {
            System.out.println("Hello from a virtual thread!");
            try {
                Thread.sleep(1000); // 模拟耗时操作
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            System.out.println("Task completed.");
        });

        // 关闭 ExecutorService
        executor.shutdown();
    }
}

在这个示例中,我们首先创建了一个 ExecutorService,专门用于虚拟线程。然后,我们通过 submit 方法提交了一个简单的任务,该任务在虚拟线程上运行。任务中包含了一个打印语句和一个模拟耗时操作(Thread.sleep)。

请注意,随着 JDK 的发展,API 和功能可能会有所变化。因此,建议查阅最新的 JDK 文档来获取最准确的信息。此外,要使用虚拟线程,你需要使用支持 Project Loom 的 JDK 版本。

虚拟线程和协程的差别

虚拟线程(Project Loom 中的一部分)和协程都是为了解决并发编程的复杂性和效率问题而设计的,但它们在实现方式和一些关键特性上有所不同:

  1. 实现层级:

    • 虚拟线程 :在 JVM 层面实现。虚拟线程是轻量级线程,由 JVM 管理。它们是对操作系统线程的抽象,旨在减少传统线程(如 Java 中的 Thread)的资源消耗。
    • 协程:通常在语言或库层面实现。协程是一种用户态的轻量级线程,不是由操作系统直接管理。在一些语言(如 Kotlin)中,协程通过库支持,而非直接集成到语言本身。
  2. 调度方式:

    • 虚拟线程:调度由 JVM 和/或操作系统管理。虚拟线程可以被操作系统视为普通线程进行调度。
    • 协程:通常由程序或协程库进行调度,不直接参与操作系统的线程调度。
  3. 使用场景和模型:

    • 虚拟线程:更接近于传统的线程模型,使用起来与标准的 Java 线程非常相似。它们适合用于简化传统的并发和多线程编程模型,减少资源使用。
    • 协程:提供了一种不同的并发模型,强调轻量级、非阻塞性和异步编程。在协程中,可以更轻松地处理异步操作和回调。
  4. 上下文切换成本:

    • 虚拟线程:尽管比传统线程轻量,但仍涉及一定程度的上下文切换成本。
    • 协程:通常具有非常低的上下文切换成本,因为它们主要在用户态进行操作。
  5. 语言支持:

    • 虚拟线程:是 Java (JDK) 的一部分,特定于 Java 生态系统。
    • 协程:在多种编程语言中以不同形式存在,例如 Kotlin、Python、Go 等。

总结来说,虚拟线程和协程都旨在提供更高效的并发处理方式,但它们在实现、调度方式和适用场景上存在差异。虚拟线程更贴近传统的线程模型,而协程提供了一种更轻量级和灵活的并发编程方式。

相关推荐
Swot13 分钟前
上传一张 4MB 图片,我先后撞上了三层请求体限制
后端
IT_陈寒23 分钟前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
OLRainM30 分钟前
实习复盘:大模型网关渠道质量评分实战(二)—— 报错了到底算谁的锅?流式归因与 Token 补账踩过的 8 个真坑
后端
梦想恒远43 分钟前
Spring Boot + LangChain4j 统计 token 成本:ChatModelListener 实测与单价口径
spring boot·后端
努力的小郑2 小时前
数据查到了,回答去哪儿了?一次百炼 + LangChain 排查实录
后端·langchain·agent
isfox2 小时前
Python 虚拟环境:别再把所有项目塞进一个"大仓库"了
后端
易师傅3 小时前
技术面试已死?AI 时代,真正拉开程序员差距的是什么?
前端·后端·程序员
苍何3 小时前
办公 Agent 权威评测榜单出炉了,豆包第一
后端
AiMan3 小时前
别再把秘塔会话逐个点开:这可把秘塔多个会话一次导出?AI导出鸭
前端·后端·面试
nice_lcj5204 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发