Java线程池的问题

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

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

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

你指的定时任务是TimerTask么?如果是调用其cancel函数即可。这个类似于线程的调用,然而也有一些区别,不过不需要线程池参与啊。你可以参考下java doc下Timer类,和TimerTask类的说明,不知是不是你的问题。追问

不是用Timer和TimerTask组合。
我用的是ScheduledThreadPoolExecutor,它是一个线程池,可以提交好多任务(实现Runnable接口),然后按照间隔时间不断执行。这个线程池的线程数目也可以增加或者减少。
但是我就是没找到如何删除任务的方法。

追答

在线程池中也是用cancel的方法取消一个任务的执行,不过是通过java.util.concurrent包中的Future接口完成,它有一个直接子类ScheduledFuture,这个子类将作为scheduleAtFixedRate函数的返回值给你,你在需要的时候cancel就可以了。
值得注意的是cancel其中任务不会导致整个进程终止,因为线程池还在活动,如果需要关闭应该调用ScheduledThreadPoolExecutor的shutdown方法,或者shutdownNow方法。

追问

明白了。利用ScheduledFuture来实现。
这个正是我需要的,线程还在活动,任务中止。
谢谢。
不过,发现一个问题,如果一个任务正在Thread.sleep(),这个时候调用ScheduledFuture的cancel时,此任务的Thread.sleep()会抛出异常。

追答

这个应该是正常的,报的是不是InterruptedException呢?
如果是那么这是说明线程运行被中断,
这是正常的,你要理解Java的异常机制,异常不一定就是错误,而是一种信息的传递,说明这里发生了“不寻常的事”,也就是异常,你用try-catch语句包起来就可以了,如果有需要在中断时处理什么,写在catch语句块里也就OK了,相信你都用到Java的多线程编程了,也应该是个老鸟了,呵呵。

追问

OK,谢谢了。

温馨提示:答案为网友推荐,仅供参考
相似回答