2010-03-26 51 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,检测需要取消,并触发一个事件来取消这些任务的相关任务。由于一切都是异步的,你不会在意是否完成取消的任务,所以不会丢失任何东西。