2014-02-13 62 views
2

我有一個非常具體的應用程序體系結構問題。Java未來<object>池

我需要解析大量的傳入目標,這些對象的分辨率是異步處理的,完成時需要將對象傳遞到下一個階段。

所以真正的問題歸結爲什麼是應對大量Future對象的優雅方法。

我應該只是將這些列入列表,迭代該列表並在完成時刪除它們?由於持續的併發訪問,列表很可能會被鎖住,併成爲一個很大的瓶頸。

對不起,如果我的問題含糊不清。

+3

您可以使用ExecutorCompletionService。例如,請參閱:http://stackoverflow.com/a/11578512/829571 – assylias

+0

您可以使用阻塞隊列或類似的設計從頭開始同時工作嗎?如果你在將它傳遞到下一個階段之前需要整個集合,那麼我認爲它是否是一個瓶頸並不重要;就是這樣。 –

回答

2

如果在任務完成後需要完成某些工作,我會將該工作添加到任務中。即不是添加任務,而是添加一個Runnable,它既執行任務,又執行您需要對結果執行的操作。這樣的結果處理是及時和併發的。

+0

分離這些階段的原因是因爲兩者都處理不同的資源,並且因爲我無法在每個線程內等待目標分辨率,因爲階段1和階段2可能異步發生,但階段2確實取決於1發生了。 – user3002369

+0

@ user3002369在這種情況下,1可以在完成1時觸發2的異步請求。 –

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) 
1

看一看這個帖子: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(); 
相關問題