ホームページ  >  記事  >  Java  >  先物を扱う際にエラーや早期終了を効率的に処理するにはどうすればよいですか?

先物を扱う際にエラーや早期終了を効率的に処理するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 10:10:29405ブラウズ

How Can I Efficiently Handle Errors and Early Termination When Working with Futures?

Future のリストの早期終了を待機

Future で表される非同期タスクを扱う場合、多くの場合、すべての処理が終了するまで待機することが重要です。完了するか、エラーが発生します。ただし、エラーが発生した後でもすべてのタスクが完了するまで不必要に待つことは望ましくありません。

この問題に対処するには、次の手順を検討してください。

  1. CompletionService:

    • 利用可能になったフューチャーを受信する CompletionService を作成します。
    • 処理をカプセル化した Callable オブジェクトを使用してタスクを送信します。
  2. 先物を順次監視します:

    • ループを使用して、CompletionService から受信した先物を繰り返し処理します。
    • 結果の取得を試みます。 Future.get() を使用して各フューチャーを使用します。
    • いずれかのフューチャーが例外をスローした場合は、エラーが発生したことを示すフラグを設定します。
  3. キャンセル残りのタスク:

    • エラーが検出されたら、不要な待機を避けるために残りのタスクをキャンセルします。

次に例を示します。このアプローチを示します:

<code class="java">Executor executor = Executors.newFixedThreadPool(4);
CompletionService<SomeResult> completionService = 
       new ExecutorCompletionService<SomeResult>(executor);

// 4 tasks
for(int i = 0; i < 4; i++) {
   completionService.submit(new Callable<SomeResult>() {
       public SomeResult call() {
           // Processing code
           return result;
       }
   });
}

int received = 0;
boolean errors = false;

while(received < 4 && !errors) {
      Future<SomeResult> resultFuture = completionService.take(); // Blocks until available
      try {
         SomeResult result = resultFuture.get();
         received ++;
         // Process the result
      }
      catch(Exception e) {
         // Log or handle the error
         errors = true;
      }

      if (errors) {
         // Cancel any remaining tasks
         executor.shutdown();
         break;
      }
}</code>

以上が先物を扱う際にエラーや早期終了を効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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