// 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 已經完成?當前代碼似乎是先完成Task 1,然后直接返回。
1 回答

桃花長相依
TA貢獻1860條經驗 獲得超8個贊
您應該使用 CountDownLatch。在您的主線程中創建它的實例并將此實例傳遞給您的任務(Callables)。然后當任務完成時調用latch.countDown()。在代碼的最后一步調用 latch.await() 以等待每個任務完成。它看起來像這樣(如果你的 callables 是作為 lambdas 創建的):
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();
添加回答
舉報
0/150
提交
取消