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 サイトの他の関連記事を参照してください。