【问题标题】:How to let a ScheduledExecutorService run a Runnable ahead of the scheduled time?如何让 ScheduledExecutorService 在预定时间之前运行 Runnable?
【发布时间】:2019-07-17 15:08:01
【问题描述】:

我使用ScheduledExecutorService 每分钟定期运行一次特定作业(实现为普通Runnable)(使用方法scheduleAtFixedDelay())。

不过,有时我希望它立即唤醒,调用Runnable,然后返回其普通策略(即再次等待 1 分钟)。

有没有简单的方法来实现这一点?

我检查了ScheduledExecutorService 及其超类的API,但到目前为止还没有找到合适的。

当然,我可以使用其他方法,例如将相同的Runnable 传递给为特殊目的而创建的单独线程,但使用ScheduledExecutorService 的方法会更优雅。

【问题讨论】:

    标签: java scheduling scheduledexecutorservice


    【解决方案1】:

    只需记住您的电话安排中的ScheduledFuture

    如果您想提前运行它,请致电future.cancel(),再次提交任务以立即执行,然后再次安排它。

    【讨论】:

    • 谢谢你的回答,我试试这个!通过“再次提交任务立即执行”你想到了 ScheduledExecutorService 的 execute(Runnable) 方法吗?如果是,这有一个缺点,即(根据文档)允许在调用者的线程中执行任务,这对我不起作用。但是让我们看看。
    • 不,我的意思是ExecutorService.submit,只要Executors 线程池中有空闲线程,您就可以将任务排入队列
    • 执行状态的文档也可以在调用者线程中执行 - 取决于您选择的执行器实现。如果您不选择执行此操作的 Executor 实现(坦率地说,我什至不知道),那么这将不会发生。
    • 再次感谢迈克尔,你帮了我很多。现在,我决定在我的执行程序池中添加另一个线程,这样当我需要在其间运行即时作业时,我什至不必取消与主线程相关的 Future。 (当然,这缩短了两次作业调用之间的时间,但这对我来说并没有什么害处。)但我会观察它随着时间的推移会如何表现——也许取消和重新启动单个线程证明是更好的解决方案。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多