Как настроить этот поток управления из 3 потоков? - PullRequest
0 голосов
/ 23 октября 2018
// Task 1 -- the main thread
        SimilarityResponse w2vResponse = questionClassifier.compute(questionInfo);

        // Task 2
        String sku = questionInfo.getSku();
        String question = questionInfo.getQuestion();
        Callable<ResponseList> dssmTask = () -> this.dssmCompute(sku, question);
        Future<ResponseList> dssmService = executorService.submit(dssmTask);
        ResponseList dssmResponse;
        try {
            LOGGER.info("start dssm ... {} ", question);
            dssmResponse = dssmService.get(Parameters.getParserTimeLimit(), TimeUnit.MILLISECONDS);
            LOGGER.info("dssmResponse ... {} ", dssmResponse);
        } catch (ExecutionException | InterruptedException e) {
            LOGGER.warn("ExecutionException | InterruptedException");
            e.printStackTrace();
        } catch (TimeoutException te) {
            dssmService.cancel(true);
            LOGGER.warn("DSSM time out for {} {}", sku, question);
        }

        // Task 3
        Callable<ResponseList> stsTask = () -> this.stsCompute(sku, question);
        Future<ResponseList> stsService = executorService.submit(stsTask);
        ResponseList stsResponse;
        try {
            LOGGER.info("start sts ... {} ", question);
            stsResponse = stsService.get(Parameters.getParserTimeLimit(), TimeUnit.MILLISECONDS);
            LOGGER.info("stsResponse ... {} ", stsResponse);
        } catch (ExecutionException | InterruptedException e) {
            LOGGER.warn("ExecutionException | InterruptedException");
            e.printStackTrace();
        } catch (TimeoutException te) {
            stsService.cancel(true);
            LOGGER.warn("STS time out for {} {}", sku, question);
        }

        // Last step == do something for above
        SimilarityResponse ensemble = new SimilarityResponse();
        return ensemble;

Прежде чем выполнить последний шаг, как я могу убедиться, что Задание 1-3 уже выполнено?Текущий код, кажется, сначала завершает задачу 1, а затем напрямую возвращается.

1 Ответ

0 голосов
/ 23 октября 2018

Вы должны использовать CountDownLatch.Создайте его экземпляр в главном потоке и передайте его вашим задачам (Callables).Затем, когда задача будет завершена, вызовите latch.countDown ().На последнем шаге вашего кода вызовите latch.await (), чтобы дождаться завершения каждой задачи.Это выглядело бы примерно так (если бы ваши вызовы были созданы как лямбды):

final CountDownLatch latch = new CountDownLatch(3);

for(int x = 0; x < 3; x++) {
    service.submit( () -> {
        // do something
        latch.countDown();
    });
}

// in the end wait for tasks to finish
latch.await();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...