【发布时间】:2012-06-24 21:15:23
【问题描述】:
我将我的 Futures 从 ExecutorService 推送到哈希映射中。稍后,我可能会从哈希映射中调用 Futures 的取消。虽然结果是真的,但我后来在 Callable 过程中打断点,好像 Future cancel() 没有任何效果。我认为这可能是两个不同引用的情况(即使在断点时引用 ID 被列为相同),但想知道是否有专家可以插话。代码如下所示:
ExecutorService taskExecutor = Executors.newCachedThreadPool();
Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();
Future<Object> future = taskExecutor.submit(new MyProcessor(uid));
results.put(uid, future);
我允许继续处理(这是一个在任务传入时提交任务的循环),稍后我可能会尝试通过调用此方法从外部源取消:
public static synchronized boolean cancelThread(String uid) {
Future<Object> future = results.get(uid);
boolean success = false;
if (future != null) {
success = (future.isDone() ? true : future.cancel(true));
if (success)
results.remove(uid);
}
return success;
}
但在调用 future.cancel() 之后,我仍然在 MyProcessor.call() 中遇到“未取消”路径 - 即它并没有真正被取消。
我在哪里做错了?有更好的办法吗?
【问题讨论】:
标签: java concurrency executorservice future