【发布时间】:2018-11-03 19:37:09
【问题描述】:
void process(String question){
Callable<ResponseList> callable1 = () -> this.stsCompute question);
Future<ResponseList>task1 = executorService.submit(callable1);
Callable<ResponseList> callable2 = () -> this.dssmCompute(question);
Future<ResponseList>task2 = executorService.submit(callable2);
try{
ResponseList stsResponse = task1.get();
ResponseList dssmResponse = task2.get();
}catch (Exception e){
e.printStackTrace();
}
// Do I need to wait until the first 2 threads complete?
processResponse(stsResponse, dssmResponse);
}
在这个“进程”方法中,我有两个额外的线程“callable1”和“callable2”同时执行。我想确保只有当这两个任务完成时,主线程'processResponse()'中的方法才能开始执行。
在这种情况下,我是否需要添加任何额外的控件来确保执行的顺序,它已经足够了吗?如果没有,如何实现这种控制?
【问题讨论】:
-
测试时会发生什么? Future.get() 的 javadoc 是怎么说的?
-
“get() 文档说,如果需要,等待计算完成,然后检索其结果。”这对 3 个线程之间的时间关系没有太大帮助。
-
嗯,是的,确实如此。它的字面意思是:等待 [...] 计算完成。并且您要确保只有当这两个任务完成后,主线程'processResponse()' 中的方法才能开始执行。鉴于您在调用 processResponse() 之前在两个期货上调用 get(),并且 get() 一直等到任务完成,所以您所做的确实确保 processResponse() 之前不会开始执行两项任务都完成了。
-
我同意JB Nizet,但请注意,当task1抛出异常并且task2仍在执行时,可以执行processResponse。
-
感谢 JB Nizet 和 Donat。太好了。
标签: java executorservice callable