Java 当异步方法中的一个线程发生异常时终止所有线程

Java 当异步方法中的一个线程发生异常时终止所有线程,java,spring-boot,asynchronous,completable-future,executor,Java,Spring Boot,Asynchronous,Completable Future,Executor,如果在异步方法中的任何一个线程中遇到异常,是否可以立即中断所有其他线程的执行?该方法返回一个completableFuture对象 @Async("asyncTaskExecutor") public CompletableFuture<String> updateOp(String department, List<Student> student, Boolean flag) { .... .... return departmentId; } @Async

如果在异步方法中的任何一个线程中遇到异常,是否可以立即中断所有其他线程的执行?该方法返回一个completableFuture对象

    @Async("asyncTaskExecutor")
public CompletableFuture<String> updateOp(String department, List<Student> student, Boolean flag)
{
....
....
return departmentId;
}
@Async(“asyncTaskExecutor”)
public CompletableFuture updateOp(字符串部门、列表学生、布尔标志)
{
....
....
返回部门ID;
}
此异步方法由另一个服务类方法调用:

    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;
}
公共列表更新的部门
{
....
....
试一试{
列表期货=新的ArrayList();
for(字符串部门:部门列表){
CompletableFuture departmentId=updateAsyncService.updateOp(部门,
学生名单、状态标志);
futures.add(departmentId);
}
CompletableFuture.allOf(futures.toArray(新的CompletableFuture[futures.size())).join();
for(可完成的未来:未来){
departmentIdList.add(future.get());
}
}捕获(例外e){
错误(e);
} 
返回部门IDList;
}
上述方法异步运行于各个部门。现在,如果任何部门的更新操作失败(运行updateOp时任何线程都会发生异常),我希望所有线程停止执行

此外,在这种情况下,我如何检索updateOp成功运行的部门,以基本上获得这些部门ID的列表。 提前感谢您的帮助。

我不确定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);
                }
            }
boolean标志=false;
for(未来:未来集){
试一试{
future.get();
}捕捉(中断异常e){
系统输出打印项次(“中断”);
}捕获(执行例外){
System.out.println(“从线程抛出的异常”);
flag=true;
打破
}
}
国际单项体育联合会(旗){
for(未来:未来集){
future.cancel(true);
}
}

这种方法不起作用,因为它仍然让线程继续执行(为将来返回FALSE。为线程返回cancel(true))。它只会阻止线程进一步执行任何新任务。此外,我们是否可以在这个异步方法中以某种方式检索executor对象