我覺得這是對多線程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?)
想法是好的,只要你不參考referenceObj ... – pgras 2010-03-26 15:03:49
謝謝麥克..我會試試看 – mickthompson 2010-03-29 13:02:39