ホームページ >Java >&#&チュートリアル >Java&#s Project Loom: 仮想スレッドと構造化タスクによる同時実行性に革命を起こす

Java&#s Project Loom: 仮想スレッドと構造化タスクによる同時実行性に革命を起こす

Susan Sarandon
Susan Sarandonオリジナル
2024-11-20 01:57:01268ブラウズ

Java

Project Loom は Java の世界を揺るがしており、それについて学んだことを共有できることに興奮しています。 Java へのこの画期的な追加機能は、同時プログラミングをより簡単かつ効率的にすることを目的としています。

Project Loom はその中核として、仮想スレッドを導入します。これらは OS スレッドに直接マッピングされない軽量のスレッドであるため、苦労せずに何百万ものスレッドを作成できます。これは、特に I/O 負荷の高いアプリケーションで、多数の同時操作を処理する上での革新的な機能です。

コードを詳しく見て、仮想スレッドを作成して使用する方法を見てみましょう:

Runnable task = () -> {
    System.out.println("Hello from a virtual thread!");
};

Thread vThread = Thread.startVirtualThread(task);
vThread.join();

とても簡単です!仮想スレッドは通常のスレッドと同じように作成できますが、リソース効率がはるかに高くなります。

Loom の最も優れた点の 1 つは、構造化された同時実行性です。この概念は、関連タスクのライフサイクルをより簡単に管理するのに役立ちます。以下に例を示します:

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    Future<String> user = scope.fork(() -> fetchUser());
    Future<List<Order>> orders = scope.fork(() -> fetchOrders());

    scope.join();
    scope.throwIfFailed();

    processUserAndOrders(user.resultNow(), orders.resultNow());
}

このコードでは、StructuredTaskScope を使用して 2 つの関連タスクを管理しています。いずれかのタスクが失敗すると、スコープはすべてのタスクをシャットダウンします。これにより、エラー処理とキャンセルがより簡単になります。

さて、これらの新機能を使用するために既存のコードをどのようにリファクタリングするか疑問に思われるかもしれません。幸いなことに、多くの場合、それは非常に簡単です。 ExecutorService を使用している場合は、多くの場合、Executors.newVirtualThreadPerTaskExecutor() に置き換えることができます。これにより、プラットフォーム スレッドの代わりに仮想スレッドが使用され、最小限のコード変更で拡張性が向上します。

Loom は、従来の同時実行パターンについての考え方も変えています。たとえば、何百万もの仮想スレッドを作成できるようになると、従来のスレッド プール パターンの必要性が低くなります。限られたスレッド プールを慎重に管理する代わりに、タスクごとに新しい仮想スレッドを作成するだけで済みます。

より複雑な例を見て、高スループットのシナリオで Loom がどのように役立つかを見てみましょう:

public class WebServer {
    public void handleRequests(int port) throws IOException {
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            while (true) {
                Socket socket = serverSocket.accept();
                Thread.startVirtualThread(() -> handleConnection(socket));
            }
        }
    }

    private void handleConnection(Socket socket) {
        try (socket;
             var in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             var out = new PrintWriter(socket.getOutputStream(), true)) {

            String request = in.readLine();
            String response = processRequest(request);
            out.println(response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String processRequest(String request) {
        // Simulate some processing time
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "Response to: " + request;
    }
}

この例では、多数の同時接続を処理できる単純な Web サーバーを作成しています。各接続は独自の仮想スレッドで処理されるため、スレッドのオーバーヘッドを気にすることなく、多数の同時接続に対応できます。

留意すべき点の 1 つは、仮想スレッドは I/O バウンドのタスクには最適ですが、CPU バウンドのタスクには何のメリットももたらさないということです。アプリケーションが CPU に依存している場合でも、同時実行を使用可能な CPU コアの数に制限する必要があります。

Project Loom では、仮想スレッドを可能にする基礎となるメカニズムである継続の概念も導入しています。通常、継続を直接操作することはありませんが、継続を理解すると、仮想スレッドが内部でどのように動作するかを理解するのに役立ちます。

Loom を採用するにあたり、パフォーマンスの最適化戦略の一部を再考する必要があります。たとえば、仮想スレッドを使用すると新しい接続の作成が安価になるため、場合によっては接続プーリングの必要性が低くなる可能性があります。

Loom が java.util.concurrent パッケージ内のすべてを置き換えるわけではないことに注意してください。同期プリミティブと同時データ構造の多くは依然として価値があり、仮想スレッドで適切に動作します。

Project Loom はまだ開発中であり、一部の API は最終リリースまでに変更される可能性があります。ただし、中心となる概念は安定しており、Java のプレビュー ビルドを使用して今すぐ実験を開始できます。

結論として、Project Loom は Java での同時プログラミングに革命を起こすことになります。 Loom は、スケーラブルで効率的な同時実行コードの作成を容易にすることで、高性能アプリケーションを構築するための新たな可能性を開きます。 Web サービス、データ処理パイプライン、またはその他の並行システムに取り組んでいる場合でも、Loom には何かが提供されます。 Java 開発者として、私たちは並行性のエキサイティングな新時代に突入しようとしています。これらの新しいツールを使って何を構築するかを見るのが待ちきれません。


私たちの作品

私たちの作品をぜひチェックしてください:

インベスターセントラル | スマートな暮らし | エポックとエコー | 不可解な謎 | ヒンドゥーヴァ | エリート開発者 | JS スクール


私たちは中程度です

Tech Koala Insights | エポックズ&エコーズワールド | インベスター・セントラル・メディア | 不可解な謎 中 | 科学とエポックミディアム | 現代ヒンドゥーヴァ

以上がJava&#s Project Loom: 仮想スレッドと構造化タスクによる同時実行性に革命を起こすの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。