タスクのキューは順番に処理される必要があります。最も単純なアプローチには、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(); } }
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 サイトの他の関連記事を参照してください。