java線程池中何使用CountDownLatch和Future來實現(xiàn)等待所有線程執(zhí)行完畢并獲取返回值的
如果你需要使用Callable接口來替代Runnable接口來執(zhí)行任務(wù),可以使用ExecutorService.submit(Callable)方法來提交任務(wù),該方法會返回一個Future對象,該對象可以用來獲取任務(wù)的返回值。
以下是一個示例代碼,展示了如何使用CountDownLatch和Future來實現(xiàn)等待所有線程執(zhí)行完畢并獲取返回值的功能:
上述代碼與之前的示例代碼類似,但是使用了Callable接口來執(zhí)行任務(wù),提交任務(wù)的方法也由executor.submit(Runnable)變?yōu)榱薳xecutor.submit(Callable),同時List<Future> futures用來存儲每個任務(wù)的Future對象,以便在所有任務(wù)執(zhí)行完畢后獲取它們的返回值。在每個Callable任務(wù)的call()方法中,除了執(zhí)行任務(wù)之外,還使用latch.countDown()方法將計數(shù)器的值減1,并返回一個整數(shù)值1作為該任務(wù)的返回值。
在等待所有線程執(zhí)行完畢之后,可以使用Future.get()方法獲取每個任務(wù)的返回值,并將它們累加到sum變量中。最后輸出計數(shù)器的值以及所有任務(wù)的返回值之和,并關(guān)閉線程池。
執(zhí)行上述代碼的結(jié)果應(yīng)該是類似于以下的輸出:
標(biāo)簽: