我认为这是多线程 Java 应用程序的常见场景,因此我将在此处尝试对其进行描述。
在我的 Java 应用程序中,我有一个threadExecutor对象,它定义了一个包含 5 个线程的池。
ExecutorService threadExecutor = Executors.newFixedThreadPool(5);
sendCallables方法负责将Job列表分配给 Executor。我使用ObjectX
跟踪List。通过这种方式,如果用户想要中断/取消线程,我可以参考未来的列表。像这样的东西:
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 就能够清理 Map 但这并不能阻止 Futures 执行,因为我仍然需要在它们上调用 .cancel() (一种与 WeakHashMap remove(Object) 方法关联的 eventHandler ?)