[解決済み] フューチャーリストの待ち時間
2022-04-14 19:08:53
質問
を返すメソッドがあります。
List
先物の
List<Future<O>> futures = getFutures();
ここで、すべてのフューチャーの処理が正常に終了するか、フューチャーから出力されるタスクのいずれかが例外をスローするまで待ちたいと思います。一つのタスクが例外を投げても、他のfutureを待つ意味はない。
単純な方法としては
wait() {
For(Future f : futures) {
try {
f.get();
} catch(Exception e) {
//TODO catch specific exception
// this future threw exception , means somone could not do its task
return;
}
}
}
しかしここで問題なのは、例えば4番目の未来が例外をスローした場合、最初の3つの未来が利用可能になるまで不必要に待つことになることです。
これを解決するにはどうしたらよいのでしょうか?カウントダウン・ラッチは何か役に立ちますか?私は、Futureを使うことができません。
isDone
というのも、javaドキュメントによると
boolean isDone()
Returns true if this task completed. Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method will return true.
解決方法は?
を使用することができます。 コンプリートサービス を使用して、準備ができ次第先物を受け取り、そのうちのひとつが例外をスローした場合は処理をキャンセルします。このようなものです。
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() {
...
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 ++;
... // do something with the result
}
catch(Exception e) {
//log
errors = true;
}
}
さらに改良して、まだ実行中のタスクの1つがエラーを投げたらキャンセルするようにしてもいいと思います。
関連
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
SpringBootApplication を型解決できない。
-
をインスタンス化することができません。
-
プロジェクトの依存関係を解決できなかった 解決
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
サーブレットクラスのインスタンス化エラーの解決法
-
Methodのinvokeメソッド実装のJavaリフレクション
-
HttpClientがGZIP形式でない場合の対処法
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
このラインで複数のマーカーを解決する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
java の例外が発生しました java
-
Javaクラスローダーにソースコードから潜り込む
-
プロジェクトの依存関係を解決できなかった 解決
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
linux run jarfile Invalid or corrupt jarfile error.
-
Javaエラーメッセージがenclosingクラスでない
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。