Java 8でLoomなしに仮想スレッドを実現:Jactlの継続機構

Virtual Threads for a scripting language in Java 8 without Loom

Java 8でLoomなしに仮想スレッドを実現:Jactlの継続機構

JactlはJavaアプリケーション向けの組込み可能なスクリプト言語で、Java 8/11でも動作しつつ、イベントループをブロックせずに長時間実行操作を扱えるように設計されています。Java 21の仮想スレッドが登場する前、著者は例外を投げてコールスタックを継続オブジェクトのチェーンに変換する独自の継続機構を実装しました。各関数は状態を保存して例外を再スローし、操作完了後にチェーンを辿って実行を再開します。この機構は、スクリプトの状態をシリアライズしてチェックポイントや冗長化にも応用できます。JMHベンチマークでオーバーヘッドを測定しています。

例外を投げるコストは主にスタックトレースの生成にあり、スタックトレースを埋めない例外は非常に効率的です。
  1. cchianel

    私は、Python(AST)からJava(バイトコード)へのトランスレータで、継続(Pythonのジェネレータに必要)を異なる方法で実装しました。スイッチディスパッチで変数を復元し、次の位置にジャンプする点は同じですが、例外を投げる代わりに、各関数を独自のクラスとして扱い、スタックや変数などをそのクラスに格納しました(関連コード: https://github.com/cdis-vm/cdis2java/blob/main/src/main/java...)。ジェネレータを「呼び出す」とき、実際に得られるのはそのクラスの新しいインスタンスなので、複数のスレッドが異なる引数で関数を呼び出すことができます。

    注意: コード自体は本番運用には程遠いので、使用しないでください!

  2. jaccomo

    著者です: Jactlは、セキュアで組み込み可能なスクリプト言語で、バイトコードにコンパイルされ、Java 8以降をサポートしています。この記事では、スクリプトに仮想スレッドのような動作を提供するために継続がどのように使用されたかを説明しています。ブロッキング操作はスクリプトを一時停止し、操作が完了すると中断したところから再開されます。

  3. arvyy

    継続に関する関連研究として、Andrea Bernardiniの論文(https://andrebask.github.io/thesis)もあります。同様の基本原理に基づいています。

この日のほかの記事

2026-09-04