我觉得这是对多线程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