日期:2014-05-20  浏览次数:20975 次

ScheduledThreadPoolExecutor删除任务
ScheduledThreadPoolExecutor里面利用scheduleAtFixedRate方法提交了几个任务。
这时候想删除其中一个任务,
看了下API,ScheduledThreadPoolExecutor继承ThreadPoolExecutor类,
此里面有个:
-------------------------------------
 boolean remove(Runnable task) 
 从执行程序的内部队列中移除此任务(如果存在),从而如果尚未开始,则其不再运行。 
-------------------------------------
我怎么remove此线程都是失败的?

我利用下面方法返回任务列表,执行其contains方法,都表示任务列表里面不包含我的任务。
-------------------------------------
BlockingQueue<Runnable> getQueue() 
  返回此执行程序使用的任务队列。 
-------------------------------------

请问如何删除一个定时任务?

------解决方案--------------------
任务列队里的任务实际上对原始的任务做了包装,所以你删除任务的参数必须是你调用scheduleAtFixedRate返回的参数。
------解决方案--------------------
API对此方法有一个说明:

此方法可用作取消方案的一部分。它可能无法移除在放置到内部队列之前已经转换为其他形式的任务。例如,使用 submit 输入的任务可能被转换为维护 Future 状态的形式。但是,在此情况下,ThreadPoolExecutor.purge() 方法可用于移除那些已被取消的 Future。