2010-03-26 50 views
5

我覺得這是對多線程Java應用程序的常見場景,所以我會盡力在這裏形容它。
的Java多線程應用程序 - 如何動態地取消期貨對象

在我的Java應用程序中,我有一個threadExecutor定義了5個線程池的對象。

ExecutorService threadExecutor = Executors.newFixedThreadPool(5); 

一個sendCallables方法負責作業的列表分配給執行器。
我跟蹤一個列表目標x的。通過這種方式,如果用戶想要中斷/取消線程,我可以返回期貨列表。類似這樣的:

Map<ObjectX, List<Future<String>>> map = new HashMap<ObjectX, Future<String>>(); 

public void sendCallables(ObjectX referenceObj, List<Callable<String>> list) { 
    ... 
    List<Future<String>> futureList = new ArrayList<Future<String>>(); 
    for(Callable<String> myCallableJob : list) { 
     Future<String> future = threadExecutor.submit(myCallableJob); 
     futureList.add(future); 
    } 
    ... 
    map.add(referenceObj, futureList); 
    ... 
} 

public void cancelFutures(ObjectX referenceObj) { 
    ... 
    List<Future<String>> list = map.get(referenceObj); 
    for(Future<String> future : list) { 
     future.cancel(); 
    } 
    map.remove(referenceObj); 
    .... 
} 

到目前爲止好。

現在有些情況下,沒有需要再執行提交的任務
在這些情況下,應用程序智能/自動地採取取消任務的決定。
當用戶的會話過期時,或者在執行所有作業之前特定流(與提交的任務相關)結束時,可以在Web應用程序中找到這種情況的示例。

所以基本上我需要每次調用cancelFutures(referenceObj)時,我的應用程序沒有意義繼續執行作業。我需要確定應用程序需要調用它時的每種情況。

我不知道是否有更好的方法來做到這一點。

我在想一個WeakHashMap能夠清理地圖一旦referenceObj不再被應用程序引用,但這不會阻止Futures被執行,因爲我仍然需要調用他們的.cancel() (一種與WeakHashMap remove(Object)方法相關的eventHandler?)

回答

3

我認爲你提出的解決方案非常好。如果你確實想真正推動從referenceObj中取消垃圾收集,那麼你可以使用WeakReference和ReferenceQueue的組合。

有這些在執行輔助類聲明的一個。

ReferenceQueue<ObjectX> refQ = new ReferenceQueue<ObjectX>(); 

執行此任務批量提交

new WeakReference<ObjectX>(referenceObj, refQ).enqueue(); 

有隻運行這個循環,其拉斷對象有變弱可到達(有資格獲得GC)線程每次和取消期貨/任務。

while (true) 
{ 
    // this blocks 
    ObjectX referenceObj = refQ.remove().get(); 
    cancelFutures(referenceObj); 
} 
+0

想法是好的,只要你不參考referenceObj ... – pgras 2010-03-26 15:03:49

+0

謝謝麥克..我會試試看 – mickthompson 2010-03-29 13:02:39

0

如果我正確理解你的問題,你有各種類型的活動發生,你不想將這些活動綁在一起,只是因爲它們可以被取消。

對我來說,這聽起來是一個需要消除各種情況下應該觸發一個事件。事件監聽器會監聽這些事件並取消相關Future

您對會議的例子 - 你有一個類,它實現javax.servlet.http.HttpSessionListner,檢測需要取消,並觸發一個事件來取消這些任務的相關任務。由於一切都是異步的,你不會在意是否完成取消的任務,所以不會丟失任何東西。