Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行器上的cancel()与remove()_Java_Future_Threadpoolexecutor - Fatal编程技术网

Java 执行器上的cancel()与remove()

Java 执行器上的cancel()与remove(),java,future,threadpoolexecutor,Java,Future,Threadpoolexecutor,最近,我使用ThreadPoolExecutor和priorityqueue,在将来的任务中遇到了future.cancel()这两种方法。 和task.remove()将其从队列中移除 更好的选择是什么?有什么区别吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不确定使用什么 删除: executor.remove(task); executor.purge(); 取消: futureObject.cancel(false); 我使用了以下方法: 取消中的错误是因

最近,我使用ThreadPoolExecutor和priorityqueue,在将来的任务中遇到了future.cancel()这两种方法。 和task.remove()将其从队列中移除

更好的选择是什么?有什么区别吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不确定使用什么

删除:

executor.remove(task);
executor.purge();
取消:

futureObject.cancel(false);
我使用了以下方法:


取消中的错误是因为我只想删除队列任务,如果它运行,就让它完成。

我会使用对您更自然的任务。如果没有最有可能是
取消的进一步信息

remove/purge
的成本要高得多,只有当您担心这些任务太多,可能会占用太多内存时才真正需要它


区别是不言而喻的,取消只会取消任务。删除/清除将任务从队列中删除。

如果您希望覆盖
取消
,或者您主要关心的是内存占用,请使用
删除/清除
。但在任何其他情况下,我都会选择取消

使用
Future.cancel()

ThreadPoolExecutor.remove()
的Javadoc声明它可能“无法删除在放入内部队列之前已转换为其他形式的任务”,因此我不建议调用它,除非您确定该任务未在内部转换

因此,如果您有一个
Future
,我建议通过调用
Future.cancel()
来取消它。如果其他人引用了
Future
并决定调用
Future.get()

如果您对被取消的任务所使用的堆的数量心存疑虑,可以在调用
Future.cancel()
后调用
ThreadPoolExecutor.purge()


顺便说一句,
ThreadPoolExecutor.purge()
方法只删除已取消的未来,因此在
remove()
之后调用
purge()
可能是不可行的。

我使用的是优先级队列,因此我保存了一个ComparableFutureTask,这表明:我重写了execute以返回ComparableFutureTask,并保存所有引用,然后在此对象上执行cancel()。由于某种原因,它不起作用。。。我想我需要针对这一事件提出一个新的问题,但在一个类似的未来任务中,它是否也会起到同样的作用?Any@sharongur你所说的;“它不工作”以及您期望发生什么?我取消了任务并重新插入了一个优先级更高的新任务,但执行顺序保持不变。没有新任务inserted@sharongur所以问题在于插入没有取消或删除?Ie与问题无关?我确实做了我贴出的问题所暗示的事情,但当我添加cancel()时;当我没有启动相同的方法时,我没有看到任何不同。无论如何,我并没有对此进行足够的调查,以提出另一个问题。我试着自己解决,如果找不到解决办法,我会再次出现在这里:)谢谢你的帮助!