複数のキューが Executor サービスによって順次実行されるタスクを保持するシナリオでは、ブロック操作により過剰なスタック領域が消費される可能性があります。この問題を軽減するには、ノンブロッキングのアプローチが望まれます。
解決策の 1 つは、結果を処理し、必要なパラメーターを渡すメソッドを含むコールバック インターフェイスを定義することです。このインターフェイスは、実行可能タスクのラッパー クラスに実装でき、実行可能タスクは実行サービスに送信されます。タスクが完了すると、コールバック インターフェイスが呼び出されます。
interface Callback { void complete(); } 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 を導入しています。 CompletableFuture を使用した例を次に示します。
CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> ExampleService.work()); f.thenAccept(listener::notify);
この例では、ExampleService.work() が非同期で実行されるタスクです。通知メソッドは、タスクの完了時に呼び出されるコールバックです。
これらの手法を使用すると、タスクをブロックせずに実行サービスに送信できるため、スタック領域の枯渇を回避しながら、大きなキューを効率的に処理できます。
以上がJava Executor はブロックせずに非同期タスク完了通知をどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。