1. 序章

コルーチンは、非常に高いレベルの同時実行性中断可能なタスクを実行する方法を提供するため、Javaスレッドの代替手段ですが、Project Loomが完了するまで、ライブラリサポートを参照して取得する必要があります。

このチュートリアルでは、コルーチンサポートを提供するそのようなライブラリの1つであるQuasarを見ていきます。

2. 設定

がJava11以降を必要とする最新バージョンのQuasarを使用します。ただし、サンプルアプリケーションは、Java7および8と互換性のある以前のバージョンのQuasarでも動作します。

Quasarは、ビルドに含める必要のある3つの依存関係を提供します。

<dependency>
    <groupId>co.paralleluniverse</groupId>
    <artifactId>quasar-core</artifactId>
    <version>0.8.0</version>
</dependency>
<dependency>
    <groupId>co.paralleluniverse</groupId>
    <artifactId>quasar-actors</artifactId>
    <version>0.8.0</version>
</dependency>
<dependency>
    <groupId>co.paralleluniverse</groupId>
    <artifactId>quasar-reactive-streams</artifactId>
    <version>0.8.0</version>
</dependency>

Quasarの実装は、正しく機能するためにバイトコードインストルメンテーションに依存しています。 バイトコードインストルメンテーションを実行するには、次の2つのオプションがあります。

  • コンパイル時、または
  • Javaエージェントを使用した実行時

Javaエージェントを使用することをお勧めします。これは、特別なビルド要件がなく、どのセットアップでも機能するためです。

2.1. MavenでJavaエージェントを指定する

MavenでJavaエージェントを実行するには、 maven-dependency-plugin を含めて、常にpropertiesの目標を実行する必要があります。

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
        <execution>
            <id>getClasspathFilenames</id>
            <goals>
               <goal>properties</goal>
            </goals>
        </execution>
    </executions>
</plugin>

プロパティゴールは、クラスパス上のquasar-core.jarの場所を指すプロパティを生成します。

アプリケーションの実行には、exec-maven-pluginを使用します。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <workingDirectory>target/classes</workingDirectory>
        <executable>echo</executable>
        <arguments>
            <argument>-javaagent:${co.paralleluniverse:quasar-core:jar}</argument>
            <argument>-classpath</argument> <classpath/>
            <argument>com.baeldung.quasar.QuasarHelloWorldKt</argument>
        </arguments>
    </configuration>
</plugin>

そのプラグインを利用してアプリケーションを起動するには、Mavenを実行します。

mvn compile dependency:properties exec:exec

3. コルーチンの実装

コルーチンを実装するには、QuasarライブラリのFibersを使用します。 ファイバーは、オペレーティングシステムではなくJVMによって管理される軽量スレッドを提供します。 RAMをほとんど必要とせず、CPUへの負担もはるかに少ないため、パフォーマンスを気にすることなく、アプリケーションに何百万ものRAMを搭載できます。

起動するにはファイバ、 のインスタンスを作成しますファイバ実行したいコードをラップして呼び出すクラス始める方法:

new Fiber<Void>(() -> {
    System.out.println("Inside fiber coroutine...");
}).start();

4. 結論

この記事では、Quasarライブラリを使用してコルーチンを実装する方法を紹介しました。 ここで見たのは最小限の実例に過ぎず、Quasarライブラリはさらに多くのことを実行できます。

すべてのソースコードをGitHubで見つけてください。