我是java(springboot)中多线程概念的新手,有一个需要解决的场景。有一个函数可以调用2个异步函数,我想使它们的执行同步发生。例如:
public void func(){
call1();
call2();
}
@Async
public void call1(){}
@Async
public void call2(){}
任何人都可以建议一种实现此功能的方法。
谢谢
答案 0 :(得分:0)
不太清楚这里的动机是什么,但是从我从问题中可以理解的是,目标似乎是您不想阻塞主线程(执行func()的线程),并同时实现串行执行call1()和call2()。如果那是您想要的,则可以使call1()和call2()同步(即删除@Async批注),并添加第三个异步方法(也许是callWrapper()),然后依次调用call1()和call2()用这种方法。
答案 1 :(得分:0)
如果您将@Async
方法更改为返回Future
,则可以等待。例如这样的
@Component
class AsyncStuff {
@Async
public ListenableFuture<?> call1() {
/** do things */
return AsyncResult.forValue(null);
}
@Async
public ListenableFuture<?> call2() {
/** do other things */
return AsyncResult.forValue(null);
}
}
@Component
class User {
@Autowired
AsyncStuff asyncStuff; // @Async methods work only when they are in a different class
public void use() throws InterruptedException, ExecutionException {
asyncStuff
.call1() // starts this execution in another thread
.get(); // lets this thread wait for the other thread
asyncStuff
.call2() // now start the seconds thing
.get(); // and wait again
}
}
但是,与在不进行异步的情况下简单完成所有操作相比,它可以确保速度较慢,因为所有这些添加操作都会在线程之间移动执行。调用线程可以代替等待其他线程执行操作,而只是在这段时间内执行代码本身。