2012-04-24 25 views
4

我有一個Callables和一個ExecutorService的集合。當我調用All時,我會返回Future對象的列表。如何判斷哪個Future對象映射到未來完成之前的哪個Callable?我可以告訴後來因爲Java併發性:如何判斷哪個Future在處理期間屬於哪個Callable?

代碼:

ExecutorService es = .....; 

Collection<Callables> uniqueCallables = .....; // each Callable is unique! 

List<Future> futures = es.invokeAll(uniqueCallables); 

// TODO--find unique Future A which is the future for Callable A! 
+1

出於興趣,您爲什麼需要這些信息? – 2012-04-24 19:48:33

+0

期貨可能(將)在不同的時間完成,也許分開幾分鐘。我通過ID區分不同類型的任務。其他人可能想要運行相同的任務(通過ID)bt沒有意識到它已經在進行中。 invokeAll是一個糟糕的選擇 - 最終以提交進行,因爲invokeAll在所有任務完成/超時之前不會返回。 – CStepnitz 2012-04-25 19:20:58

回答

8

基於Java referenceinvokeAll(uniqueCallables)List<Future>保留順序由uniqueCallables.iterator()產生的順序:

返回: 列表代表任務的期貨,與給定任務列表的迭代器產生的 相同的順序, 每個已完成。

2

聽起來像你,只需要能夠查找從未來的原始可調用。如果你不使用invokeAll,你可以修飾包裝submit()的Executor來創建一個ContextualFuture,它保持對原始可調用的引用。

/*pseudo example*/ 
class ContextualFuture<RETURN> implements Future<RETURN> { 
    private Callable<RETURN> callable; 
    private Future<RETURN> wrappedFuture; 
    public ContextualFuture(Callable<RETURN> callable, Future<RETURN> future){ 
     this.callable = callable; 
     this.future = future; 
    } 
    // implemented/wrapped methods 
} 

class ContextualThreadPool { 
    private ExecutorService wrappedExecutor; 
    public <T> ContextualFuture<T> submit(Callable<T> task){ 
     Future<T> f = wrappedExecutor.submit(task); 
     return new ContextualFuture<T>(task, f); 
    } 
} 
相關問題