ホームページ > Java > &#&チュートリアル > Java ExecutorService タスクで例外を処理する方法?

Java ExecutorService タスクで例外を処理する方法?

Barbara Streisand
リリース: 2024-11-10 12:36:02
オリジナル
316 人が閲覧しました

How to Handle Exceptions in Java ExecutorService Tasks?

Java ExecutorService タスクでの例外処理

Java の ThreadPoolExecutor を利用して、制限されたスレッド プール サイズでタスクを同時に実行する場合、タスク中に発生する可能性のある潜在的な例外を管理することが重要です。実行。ただし、この目的で afterExecute メソッドを使用すると、期待どおりに動作しない可能性があります。

問題:

提供された例:

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!");
    }
}
ログイン後にコピー

afterExecute メソッドは、タスクが例外をスローした場合には呼び出されません。代わりに、例外が発生したにもかかわらず、出力では「すべて正常です」と誤って表示されます。これは、submit(Callable c) の代わりに submit(Runnable r) を使用しているため、例外がスローされないためです。

Callable と Runnable

を効果的に比較するにはタスクの例外を処理する場合は、タスクを ThreadPoolExecutor に送信するときに、Runnable ではなく Callable を使用することをお勧めします。 Callable の call() メソッドはチェック例外をスローでき、その後、Future.get() を介して呼び出しスレッドに伝播されます。

例:

Callable<String> task = ...
Future<String> future = executor.submit(task);

// Do something else while task executes...

try {
    String result = future.get();
} catch (ExecutionException ex) {
    Throwable cause = ex.getCause();
    // Handle the exception as necessary
}
ログイン後にコピー

If Callable.call() メソッドは例外をスローします。例外は ExecutionException にラップされ、Future.get() によってスローされます。これにより、呼び出しスレッドで例外を適切に処理できるようになります。

注: このソリューションは、Future.get() 呼び出し中に呼び出しスレッドをブロックする可能性があることに注意することが重要です。より高度なエラー処理および回復シナリオについては、特殊なエラー処理フレームワークまたはカスタム実装の使用を検討してください。

以上がJava ExecutorService タスクで例外を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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