Java 当异步方法中的一个线程发生异常时终止所有线程
如果在异步方法中的任何一个线程中遇到异常,是否可以立即中断所有其他线程的执行?该方法返回一个completableFuture对象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
@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对象