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

问题描述 投票:0回答:1

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

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

这个异步方法被另一个服务类方法调用。

    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运行成功,基本上可以得到这些部门的Ids列表。先谢谢大家的帮助。

java spring-boot asynchronous completable-future executor
1个回答
0
投票

不知道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);
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.