我讀了很多關於ExecutorService
的帖子,但我無法找到我需要的方式。立即關閉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
任何幫助將不勝感激。
你不會在代碼的任何地方檢查任務1看看如果當前線程被中斷。 – Zymus
我同意,但哪裏會有關於每個線程失敗的信息? ,如果有兩個以上的線程在問題發生後拋出。也許我的方法是錯誤的,但我看不到一個好的方法。 – abdiel
來自文檔:除了竭盡全力嘗試停止處理主動執行的任務之外,沒有任何保證。例如,典型的實現將通過Thread.interrupt()取消,所以任何不能響應中斷的任務都不會終止。 - 你需要實際處理任務被中斷的情況。當任務2中斷時,任務1已經運行。 – pandaadb