在异步方法中发生异常时终止所有线程

如果异步方法中的任何一个线程遇到异常,是否可以立即中断所有其他线程的执行?该方法返回一个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成功运行于哪些部门,从而基本上获得那些部门ID的列表。 感谢您的任何事先帮助。

iCMS 回答:在异步方法中发生异常时终止所有线程

不确定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);
                }
            }
本文链接:https://www.f2er.com/2124068.html

大家都在问