我有一個非常具體的應用程序體系結構問題。Java未來<object>池
我需要解析大量的傳入目標,這些對象的分辨率是異步處理的,完成時需要將對象傳遞到下一個階段。
所以真正的問題歸結爲什麼是應對大量Future對象的優雅方法。
我應該只是將這些列入列表,迭代該列表並在完成時刪除它們?由於持續的併發訪問,列表很可能會被鎖住,併成爲一個很大的瓶頸。
對不起,如果我的問題含糊不清。
我有一個非常具體的應用程序體系結構問題。Java未來<object>池
我需要解析大量的傳入目標,這些對象的分辨率是異步處理的,完成時需要將對象傳遞到下一個階段。
所以真正的問題歸結爲什麼是應對大量Future對象的優雅方法。
我應該只是將這些列入列表,迭代該列表並在完成時刪除它們?由於持續的併發訪問,列表很可能會被鎖住,併成爲一個很大的瓶頸。
對不起,如果我的問題含糊不清。
如果在任務完成後需要完成某些工作,我會將該工作添加到任務中。即不是添加任務,而是添加一個Runnable,它既執行任務,又執行您需要對結果執行的操作。這樣的結果處理是及時和併發的。
分離這些階段的原因是因爲兩者都處理不同的資源,並且因爲我無法在每個線程內等待目標分辨率,因爲階段1和階段2可能異步發生,但階段2確實取決於1發生了。 – user3002369
@ user3002369在這種情況下,1可以在完成1時觸發2的異步請求。 –
來自Java8的CompletableFuture有組織任務鏈的方法。特別是,
allOf(CompletableFuture<?>... cfs)
Returns a new CompletableFuture that is completed when all of the
given CompletableFutures complete.
因此,收集所有CompletableFuture第一階段的陣列中的cfs
,並調用
CompletableFuture.allOf(cfs).thenRunAsync(nextPhase)
看一看這個帖子:https://stackoverflow.com/a/24363156/1248724
因爲要等待所有任務的完成,直到你可以做自己的成績下一階段你正在尋找一個CountDownLatch
。
這裏使用ExecutorService的一個例子:
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks);
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
taskExecutor.execute(new MyTask());
}
try {
latch.await();
} catch (InterruptedException E) {
// handle
}
,你的任務中(括在嘗試/終於)
latch.countDown();
您可以使用ExecutorCompletionService。例如,請參閱:http://stackoverflow.com/a/11578512/829571 – assylias
您可以使用阻塞隊列或類似的設計從頭開始同時工作嗎?如果你在將它傳遞到下一個階段之前需要整個集合,那麼我認爲它是否是一個瓶頸並不重要;就是這樣。 –