执行者服务的未来任务未真正取消
我将我的未来从执行器服务推送到哈希映射中。稍后,我可能会从哈希映射中对期货进行取消。尽管结果是正确的,但我后来在可调用过程中遇到了断点,就好像 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() 中遇到一个“未取消”的路径 - 即它并没有真正被取消。
我哪里出错了?有没有更好的方法来做到这一点?