[解決済み】Java ExecutorService タスクの例外処理について
2022-04-05 04:16:53
質問
Java の
ThreadPoolExecutor
クラスを使用して、多数の重いタスクを一定の数のスレッドで実行します。各タスクは、例外によって失敗する可能性がある場所がたくさんあります。
をサブクラス化しました。
ThreadPoolExecutor
をオーバーライドし
afterExecute
このメソッドは、タスクの実行中に発生したキャッチできない例外を提供することになっています。しかし、うまくいかないようです。
例えば
public class ThreadPoolErrors extends ThreadPoolExecutor {
public ThreadPoolErrors() {
super( 1, // core threads
1, // max threads
1, // timeout
TimeUnit.MINUTES, // timeout units
new LinkedBlockingQueue<Runnable>() // work queue
);
}
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if(t != null) {
System.out.println("Got an error: " + t);
} else {
System.out.println("Everything's fine--situation normal!");
}
}
public static void main( String [] args) {
ThreadPoolErrors threadPool = new ThreadPoolErrors();
threadPool.submit(
new Runnable() {
public void run() {
throw new RuntimeException("Ouch! Got an error.");
}
}
);
threadPool.shutdown();
}
}
このプログラムの出力は、スレッドプールに提出された唯一のRunnableが例外をスローしているにもかかわらず、"Everything's fine--situation normal!"となっています。何が起こっているのか、何か手がかりはありますか?
ありがとうございます。
解決方法は?
からの ドキュメント :
注:アクションが タスク(FutureTaskなど) のようなメソッドで明示的に、あるいは サブミットする場合、これらのタスクオブジェクトはキャッチし 計算例外を保持し ので、突然の 終了し、内部 の例外が渡されることはありません。 メソッドを使用します。
Runnableを投稿すると、Futureでラップされます。
afterExecuteはこのような感じになります。
public final class ExtendedExecutor extends ThreadPoolExecutor {
// ...
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Future<?> future = (Future<?>) r;
if (future.isDone()) {
future.get();
}
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
if (t != null) {
System.out.println(t);
}
}
}
関連
-
[解決済み] Java の条件付きコンパイル:コードチャンクをコンパイルしないようにするには?
-
[解決済み] アニメーションGIFの表示
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] JVMフラグCMSClassUnloadingEnabledは、実際に何をするのですか?
-
[解決済み] Firebase クラスにシリアライズするプロパティが見つからない
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] 要素 'beans' の宣言が見つかりません。
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] IntegerからBigIntegerへの変換
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について