Нужно ли контролировать выполнение этих двух потоков с помощью основных потоков? - PullRequest
0 голосов
/ 03 ноября 2018
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 голосов
/ 04 ноября 2018

С Java8 + я бы предложил использовать Completable Futures. Он поддерживает именно тот случай использования, которого вы пытаетесь достичь.

Допустимые фьючерсы: Java 8

Пример алгоритма выглядит так:

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

Примечание: var - это поддержка typeInference в java 10 +

Кроме того, существует множество примеров по завершаемым фьючерсам

0 голосов
/ 04 ноября 2018

Вы должны использовать ExecutorService.invokeAll, который вернет список фьючерсов после завершения. Кроме того, я бы использовал более короткий синтаксис, что-то вроде

 List<Future> futures = executorService.invokeAll(Arrays.asList(()->dssmCompute(), ()->dssmCompute()));
...