ホームページ > Java > &#&チュートリアル > Java Executor でブロックせずにタスク完了通知を取得する方法?

Java Executor でブロックせずにタスク完了通知を取得する方法?

Linda Hamilton
リリース: 2024-11-17 05:57:03
オリジナル
767 人が閲覧しました

How to Get Task Completion Notifications Without Blocking in Java Executors?

Java Executor: タスク完了時にブロックせずに通知

問題ステートメント

タスクのキューは順番に処理される必要があります。最も単純なアプローチには、Future で .get() を使用して各タスクの完了をブロックすることが含まれますが、このアプローチでは、多数のキューを管理するときにメモリの問題が発生する可能性があります。目標は、タスクの完了を呼び出し元に通知する非ブロッキング メカニズムを実装し、タスクをブロックせずに順次処理できるようにすることです。

解決策

ブロックを回避するには、解決策には次の定義が含まれます。タスク完了時にパラメータを受け取るコールバック インターフェイス。このコールバックは、各タスクの終了時に呼び出されます。

カスタム コールバック タスク

class CallbackTask implements Runnable {

  private final Runnable task;
  private final Callback callback;

  CallbackTask(Runnable task, Callback callback) {
    this.task = task;
    this.callback = callback;
  }

  public void run() {
    task.run();
    callback.complete();
  }

}
ログイン後にコピー

CompletableFuture

Java 8 では、CompletableFuture が導入されました。これは、タスクを作成するためのより包括的なメカニズムを提供します。非同期パイプラインと条件付きパイプライン。

import java.util.concurrent.CompletableFuture;

public class GetTaskNotificationWithoutBlocking {

  public static void main(String... argv) throws Exception {
    ExampleService svc = new ExampleService();
    GetTaskNotificationWithoutBlocking listener = new GetTaskNotificationWithoutBlocking();
    CompletableFuture<String> f = CompletableFuture.supplyAsync(svc::work);
    f.thenAccept(listener::notify);
  }

}
ログイン後にコピー

ExampleService クラス:

class ExampleService {

  String work() {
    // Code to perform long-running task
    return "Result from long-running task";
  }

}
ログイン後にコピー

リスナー クラス内:

class GetTaskNotificationWithoutBlocking {

  void notify(String msg) {
    // Code to handle the message from the completed task
  }

}
ログイン後にコピー

以上がJava Executor でブロックせずにタスク完了通知を取得する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート