如何从调度执行器服务中删除任务?

2022-08-31 13:00:40

我有一个那个时候几个不同的任务周期性地与ScheduledExecutorServicescheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);

我还有一个不同的,我用于这个调度程序。当我想从计划程序中删除其中一个任务时,问题就开始了。Runnable

有没有办法做到这一点?

我是否使用一个计划程序为不同的任务执行正确的操作?实现这一点的最佳方法是什么?


答案 1

只需通过以下方式取消返回的未来:scheduledAtFixedRate()

// Create the scheduler
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// Create the task to execute
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
};
// Schedule the task such that it will be executed every second
ScheduledFuture<?> scheduledFuture =
    scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS);
// Wait 5 seconds
Thread.sleep(5000L);
// Cancel the task
scheduledFuture.cancel(false);

需要注意的另一件事是,取消不会从计划程序中删除任务。它所确保的只是该方法始终返回 。如果您不断添加此类任务,这可能会导致内存泄漏。例如:如果您根据某些客户端活动或UI按钮单击启动任务,请重复n次并退出。如果该按钮被点击太多次,您可能最终会得到无法进行垃圾回收的大线程池,因为调度程序仍然有引用。isDonetrue

您可能希望在 Java 7 及更高版本中可用的类中使用。为了向后兼容,默认值设置为 false。setRemoveOnCancelPolicy(true)ScheduledThreadPoolExecutor


答案 2

如果您的实例扩展(例如),您可以使用(但请参阅其javadoc中的注释:“它可能无法删除在放入内部队列之前已转换为其他形式的任务。ScheduledExecutorServiceThreadPoolExecutorScheduledThreadPoolExecutorremove(Runnable)purge()


推荐