私は多くの投稿をExecutorService
について読んでいますが、私が必要とする方法を見つけることができません。Shutdown now on ExecutionException
いくつかの並列スレッドが必要です。いずれかがカスタム例外をスローすると、残りのタスクはすべてキャンセルされます。
これは私が行ったことの例です。タスクは同時に動作していますが、例外が発生しても中断されません。
public class Main {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
List<Future> futures = new ArrayList<Future>();
futures.add(executorService.submit(new Callable<Void>() {
public Void call() throws Exception {
Thread.sleep(5000);
System.out.println("Task 1 done");
return null;
}
}));
futures.add(executorService.submit(new Callable<Void>() {
public Void call() throws Exception {
Thread.sleep(2000);
System.out.println("Task 2 done");
if (true) {
throw new CustomException("Error on task 2");
}
return null;
}
}));
executorService.shutdown();
try {
executeFutures(futures);
} catch (CustomException ex) {
System.out.println("Received:" + ex.getMessage());
executorService.shutdownNow();
}
}
private static void executeFutures(List<Future> futures) throws CustomException {
try {
for (Future f : futures) {
f.get();
}
} catch (ExecutionException | InterruptedException e) {
if (e.getCause() instanceof CustomException) {
throw (CustomException) e.getCause();
}
}
}
}
これが出力されます。
Task 2 done //exception is thrown here but task1 continue.
Task 1 done
Received:Error on task 2
任意の助けが理解されるであろう。
。 – Zymus
私は同意しますが、各スレッドの失敗に関する情報はどこにありますか? 2つ以上のスレッドがある場合は、質問が行われた後にスローされます。多分私のアプローチは間違っていますが、私は良いものを見ません。 – abdiel
ドキュメントから:積極的に実行中のタスクの処理を停止しようとするベストエフォート型の試み以外の保証はありません。例えば、典型的な実装はThread.interrupt()を介して取り消されるので、割り込みに応答しないタスクは決して終了しないかもしれません。 - あなたの仕事が中断されるケースを実際に処理する必要があります。タスク1は、タスク2が中断したときに既に実行されていました。 – pandaadb