【问题标题】:interfere with ScheduledThreadPoolExecutor's schedule干扰 ScheduledThreadPoolExecutor 调度
【发布时间】:2013-03-31 01:32:09
【问题描述】:

我使用ScheduledThreadPoolExecutor.scheduledAtFixedRate 来安排一些任务在每个dt 间隔运行一次。

但有时,我确实想强制立即执行任务。任务执行后,我希望日程恢复正常。 (即,在此“强制”执行之后的一些 dt 时间量,应再次执行该任务)。

ScheduledThreadPoolExecutor 可以做到这一点吗?你能告诉我怎么做吗?一些简单的例子会很棒!

我想可以通过简单地关闭计划、手动执行任务并再次调用scheduleAtFixedRate 来做到这一点,但我想知道这是否是一种好习惯。

谢谢

【问题讨论】:

    标签: java timer scheduled-tasks


    【解决方案1】:

    这是个好问题。也许您可以在通过调用scheduledAtFixedRate() 收到的ScheduledFuture<T> 上调用cancel(),使用submit() 手动提交任务,然后当Future 回来时再次重新安排您的固定费率任务?我想您必须检查该任务是否尚未运行。

    一些伪代码...

    ScheduledFuture<Thingy> sf = executor.scheduleAtFixedRate(myTask, etc...);
    sf.cancel();
    final Future<Thingy> f = executor.submit(myTask);
    f.get();
    sf = executor.scheduleAtFixedRate(myTask, etc...);
    

    我从来没有做过,这是一个有趣的问题。

    【讨论】:

    • 谢谢你的回答,我有点像这样的想法,但我想知道这是一个很好的做法。还有什么我应该注意的其他音调下降吗?
    【解决方案2】:

    对于一次性执行使用

    ScheduledFuture<Thingy> sf = executor.schedule(myTask, 0, SECONDS);
    

    这将立即执行一次myTask,但不会停止执行之前安排的任务,并间隔一段时间。这真的有问题吗?

    【讨论】:

    • 嗯,...不会给你一些错误,比如“任务”已经安排好了?
    • 为什么?任务(Runnable 或 Callable 实例)被包装和调度。没有执行者会检查是否存在,您可以随意提交一项任务。
    • 也许我没有提到,但如果我只是盲目地提交任务,那么两次执行可能会同时发生,我不希望这种情况发生。这就是为什么我想“强制”任务立即执行,而不是提交新任务。
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多