Java 8 如何实现 Virtual Threads 效果

Virtual Threads for a scripting language in Java 8 without Loom

Java 8 如何实现 Virtual Threads 效果

在 Java 21 推出 Virtual Threads 之前,我开发 Jactl 时就面临一个难题:如何在 Java 8 环境下让脚本执行阻塞操作时不卡死事件循环线程。我的解决方案是利用 Continuations 机制,通过抛出特殊的 Continuation 异常来保存执行状态,待操作完成后再恢复。这种方法让 Jactl 脚本在调用 sleep 或数据库请求时能自动挂起并释放线程,完美适配 Vert.x 等响应式架构。如今虽然 Java 21 原生支持 Virtual Threads,但这一机制让旧版本应用也能享受非阻塞编程的便利,甚至支持将脚本状态序列化进行断点续传。

只要抛出的异常不生成堆栈跟踪,其实际开销非常低。
  1. cchianel

    我在自己的 Python (AST) 到 Java (bytecode) 转换器中,用不同的方式实现了 continuations(Python 生成器所必需的功能)。恢复变量并跳转到下一个位置的 switch 分发机制是一样的,但我没有抛异常,而是将每个函数视为一个独立的类,并将栈、变量等存储在类上(相关代码:https://github.com/cdis-vm/cdis2java/blob/main/src/main/java...)。当你“调用”生成器时,实际得到的是该类的一个新实例,因此多个线程可以用不同的参数调用该函数。

    注意:代码本身远未达到生产就绪状态,请勿使用!

  2. jaccomo

    作者在此:Jactl 是一种安全且可嵌入的脚本语言,可编译为字节码,支持 Java 8 及更高版本。文章描述了如何利用 Continuations 为脚本提供类似 Virtual Thread 的行为。

    阻塞操作会挂起脚本,待操作完成后,脚本将从挂起点恢复执行。

  3. arvyy

    关于 continuations 的相关工作,Andrea Bernardini 也有一篇论文(https://andrebask.github.io/thesis),其核心思想与此类似。

同日更多故事

2026-09-04