我需要用主线程来控制这两个线程的执行吗?
Do I need to control the execution of these two threads with the main threads?
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);
}
在这个 "process" 方法中,我有两个额外的线程 'callable1' 和 'callable2' 要同时执行。我想确定只有当这两个任务完成后,主线程'processResponse()'中的方法才能开始执行。
在这种情况下,我是否需要添加任何额外的控制来保证执行的顺序,这已经足够了吗?如果没有,如何实现这种控制?
您应该使用 ExecutorService.invokeAll,它将在完成后 return 期货列表。此外,我会使用更短的语法,例如
List<Future> futures = executorService.invokeAll(Arrays.asList(()->dssmCompute(), ()->dssmCompute()));
对于 Java8+,我建议使用 Completable Futures。它完全支持您要实现的用例。
可完成期货:Java 8
示例算法如下所示:
var cf = CompletableFuture.supplyAsync(() -> processQuestion()).runAsync(() -> processResponse)
注意: var 是 java 10+
支持的类型推断
此外,还有很多关于可完成期货的例子
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);
}
在这个 "process" 方法中,我有两个额外的线程 'callable1' 和 'callable2' 要同时执行。我想确定只有当这两个任务完成后,主线程'processResponse()'中的方法才能开始执行。
在这种情况下,我是否需要添加任何额外的控制来保证执行的顺序,这已经足够了吗?如果没有,如何实现这种控制?
您应该使用 ExecutorService.invokeAll,它将在完成后 return 期货列表。此外,我会使用更短的语法,例如
List<Future> futures = executorService.invokeAll(Arrays.asList(()->dssmCompute(), ()->dssmCompute()));
对于 Java8+,我建议使用 Completable Futures。它完全支持您要实现的用例。
可完成期货:Java 8
示例算法如下所示:
var cf = CompletableFuture.supplyAsync(() -> processQuestion()).runAsync(() -> processResponse)
注意: var 是 java 10+
支持的类型推断此外,还有很多关于可完成期货的例子