Завершить все потоки при возникновении исключения для одного в асинхронном методе - PullRequest
0 голосов
/ 16 июня 2020

Можно ли немедленно прервать выполнение всех остальных потоков, если в любом из потоков асинхронного метода обнаружено исключение? Метод возвращает объект CompletetableFuture.

    @Async("asyncTaskExecutor")
public CompletableFuture<String> updateOp(String department, List<Student> student, Boolean flag)
{
....
....
return departmentId;
}

Этот асинхронный c метод вызывается другим методом класса обслуживания:

    public List<String> updateDepartments
{
....
....
try {
List<CompletableFuture<String>> futures = new ArrayList<>();
for (String department: departmentList) {
            CompletableFuture<String> departmentId= updateAsyncService.updateOp(department,
                    studentList, statusFlag);
            futures.add(departmentId);
        }
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
        for (CompletableFuture<String> future : futures) {
            departmentIdList.add(future.get());
        }
} catch (Exception e) {
        logger.error(e);
        } 
return departmentIdList;
}

Вышеупомянутый метод выполняется для различных отделов асинхронно. Теперь, если операция обновления не выполняется для какого-либо отдела (исключение возникает в любом потоке при выполнении updateOp), я хочу, чтобы все потоки прекратили свое выполнение. updateOp запущен успешно, чтобы получить список этих идентификаторов отделов. Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 16 июня 2020

Не уверен, что join () действительно выполнит вашу задачу. Попробуйте обработать его, как показано ниже, во фрагменте кода. Удачи!

            boolean flag = false;
            for (Future<Void> future : futureSet ) {
                try {
                    future.get();
                } catch (InterruptedException e) {
                    System.out.println("Interrupted");
                } catch (ExecutionException e) {
                    System.out.println("Exception thrown from the thread");
                    flag = true;
                    break;
                }
            }

            if(flag) {
                for (Future<Void> future : futureSet) {
                    future.cancel(true);
                }
            }
...