我是否需要用主线程控制这两个线程的执行?

时间:2018-11-03 19:37:09

标签: java executorservice callable

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()”中的方法才能开始执行。

在这种情况下,我是否需要添加任何其他控件以确保执行顺序,是否已经足够好?如果没有,该如何进行控制?

2 个答案:

答案 0 :(得分:1)

您应该使用ExecutorService.invokeAll,完成后将返回期货列表。此外,我会使用较短的语法,例如

List<Status>

答案 1 :(得分:0)

对于Java8 +,我建议使用Completable Futures。它完全支持您要实现的用例。

可完成的期货:Java 8

样本算法如下:

var cf = CompletableFuture.supplyAsync(()-> processQuestion())。runAsync(()-> processResponse)

注意: var是Java 10+中的typeInference支持

此外,还有很多关于可完成期货的例子