如何有效地取消定期的ScheduledExecutorService任务

mre*_*mre 18 java multithreading

因此,使用链接作为参考,是否有人可以建议更优雅的解决方案来取消定期的ScheduledExecutorService任务?

这是我目前正在做的一个例子:

// do stuff

// Schedule periodic task
currentTask = exec.scheduleAtFixedRate(
                            new RequestProgressRunnable(),
                            0, 
                            5000,
                            TimeUnit.MILLISECONDS);

// Runnable
private class RequestProgressRunnable implements Runnable
{
        // Field members
        private Integer progressValue = 0;

        @Override
        public void run()
        {
            // do stuff

            // Check progress value
            if (progressValue == 100)
            {
                // Cancel task
                getFuture().cancel(true);
            }
            else
            {
                // Increment progress value
                progressValue += 10;
            }
        }
    }

    /**
     * Gets the future object of the scheduled task
     * @return Future object
     */
    public Future<?> getFuture()
    {
        return currentTask;
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 15

我建议你使用int并自己安排任务.

executor.schedule(new RequestProgressRunnable(), 5000, TimeUnit.MILLISECONDS);

class RequestProgressRunnable implements Runnable {
    private int count = 0;
    public void run() {
        // do stuff

        // Increment progress value
        progressValue += 10;

        // Check progress value
        if (progressValue < 100)
            executor.schedule(this, 5000, TimeUnit.MILLISECONDS);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @bestsss,这可能是真的,但是掌握未来是比较棘手的,因为在构建和安排Runnable之前你没有它.当您尝试取消它时,您将面临未来未设置的风险.;) (5认同)
  • 这实际上是`scheduleWithFixedDelay`而不是`scheduleAtFixedRate`.如果您可以访问执行程序,则在返回的将来调用cancel会更容易. (3认同)