如何从ScheduledExecutorService中删除任务?
我有一个ScheduledExecutorService,定期用.scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
定期执行一些不同的任务.scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
我也有一个不同的Runnable
,我正在使用这个调度器。 当我想从调度程序中删除其中一个任务时,问题就开始了。
有没有办法做到这一点?
我是否正确地使用一个调度程序来完成不同的任务? 什么是实施这个最好的方法?
只需取消scheduledAtFixedRate()
返回的将来即可:
public static void main(String[] args) throws InterruptedException { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); Runnable r = new Runnable() { @Override public void run() { System.out.println("Hello"); } }; ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS); Thread.sleep(5000L); scheduledFuture.cancel(false); }
另外需要注意的是,取消不会从调度程序中删除任务。 所有它确保isDone方法总是返回true。 这可能会导致内存泄漏,如果你不断添加这样的任务。 例如:如果您根据某些客户端活动或UIbutton单击来启动任务,请重复执行n次并退出。 如果点击该button的次数太多,那么最终可能会产生大量的线程池,因为调度程序仍然有参考,所以无法收集垃圾。
您可能希望在Java 7以后的ScheduledThreadPoolExecutor类中使用setRemoveOnCancelPolicy(true)。 为了向后兼容,默认设置为false。