JAVA - 取消ThreadPoolExecutor正在运行的任务

6
我需要的是一种类似于shutdownNow的方法,但在执行该方法后仍能提交新任务。我的ThreadPoolExecutor将在程序执行期间接受随机数量的任务。

1
是否存在关闭当前ExecutorService并替换为新的选项? - tylermac
3个回答

10
你可以获取每个提交的 Future,将这些 Future 存储在一个集合中,然后当你想取消任务时,调用所有排队任务的 future.cancel() 方法。使用此解决方案,执行程序仍在运行,任何正在运行的任务都将被取消或者如果它们在队列中,则不会运行。

谢谢,我对你的解决方案唯一的问题是关于集合的大小,因为我的ThreadPoolExecutor将会接收无限的任务。但是通过使用Map<Runnable,Future>并重写submit和afterExecute方法,我可以仅维护正在运行的任务的集合。 - rgomesf

0
为什么不创建自己的ExecutorService来展示这种行为呢?

-1

仅执行getQueue()和clear()不足以满足需求吗?如果您确实需要尝试停止正在运行的任务,则需要对ThreadPoolExecutor进行子类化,并基本上重新实现shutdownNow(),但仅复制向每个线程发送中断的位。请注意,这仍然不能保证您实际上会导致它们立即停止并且不再进行任何计算。如果您需要做到这一点,您需要完全不同的方法。


我已经尝试重新实现shutdownNow(),但有些变量是私有的,没有它们我无法做我想做的事情... - rgomesf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接