ホームページ > Java > &#&チュートリアル > CompletionService を使用して、Future リストの待機を最適化し、例外を効率的に処理するにはどうすればよいでしょうか?

CompletionService を使用して、Future リストの待機を最適化し、例外を効率的に処理するにはどうすればよいでしょうか?

Patricia Arquette
リリース: 2024-10-25 19:58:29
オリジナル
1126 人が閲覧しました

How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?

CompletionService による Future リストの待機の最適化

Future のリストを操作するときは、Future のリストの完了を効率的に待機したり、例外を処理したりすることが重要です。不必要な遅延を防ぎます。

Future のリストを返す次のメソッドがあるとします。

1

List<Future<O>> futures = getFutures();

ログイン後にコピー

完了を待つか例外をキャッチするには、単純なアプローチは次のようになります。

1

2

3

4

5

6

7

8

9

10

11

wait() {

  for(Future f : futures) {

    try {

      f.get();

    } catch(Exception e) {

       //Specific exception handling

       //Exception in a future, stop waiting

       return;

    }

  }

}

ログイン後にコピー

ただし、このアプローチは、前の Future の例外に関係なく、各 Future を待ちます。

解決策は、CompletionService を使用して、Future が利用可能になったときに受け取ることです。例外が発生した場合は、他のタスクをキャンセルできます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

Executor executor = Executors.newFixedThreadPool(4);

CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor);

 

//Submit tasks

for(int i = 0; i < 4; i++) {

  completionService.submit(() -> {

    ...

    return result;

  });

}

 

int received = 0;

boolean errors = false;

 

while(received < 4 && !errors) {

  Future<SomeResult> resultFuture = completionService.take(); //Blocks if none available

  try {

    SomeResult result = resultFuture.get();

    received++;

    ... //Process result

  } catch(Exception e) {

    //Log and set error flag

    errors = true;

  }

}

ログイン後にコピー

このアプローチでは、タスクは実行者に送信され、完了したタスクは完了サービスを通じて受信されます。受信したタスクで例外が発生した場合、while ループは終了し、エグゼキューターの shutdownNow() メソッドを使用して残りのタスクをキャンセルできます。

以上がCompletionService を使用して、Future リストの待機を最適化し、例外を効率的に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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