【问题标题】:Schedule a task that runs every x milliseconds安排每 x 毫秒运行一次的任务
【发布时间】:2021-12-18 20:39:50
【问题描述】:

作为我功课的一部分,我正在尝试编写一个 java 方法来安排每 x 毫秒运行一次的任务

public Sc​​heduledTask scheduleEvery(long time, Runnable task)

第一次执行是在调用另一个方法 fire(long time) 时。例如:

  1. 时间 = 2001
  2. 提交 scheduler.every(1000, runnable);
  3. fire(2345) -> runnable 被执行 -> 计划在 3345
  4. fire(3123) -> 注意发生
  5. fire(4566) -> runnable 执行一次 -> 调度到 5566 ....

我正在考虑创建一个列表来存储这些任务。当调用 fire() 时,它们将被执行,从列表中删除并在 x 毫秒后重新安排。谁能告诉我这是否可行?

【问题讨论】:

  • 如果你真的想这样做(而且这不是你自己写的作业)然后使用:docs.oracle.com/javase/8/docs/api/java/util/concurrent/…
  • 遗憾的是,这确实是我的硬件,我必须从头开始构建它
  • 您能否详细说明为什么fire(3123) 不会发生任何事情?那是因为已经有计划任务了吗?为什么fire(2345) 会导致重新安排,因为已经为 3001 安排了任务?那是因为该任务已经运行一次了吗?
  • 第一次调用 fire() 时执行任务,在本例中为 2345,由于我的(尚未编码) scheduleEvery() 的性质,它被安排为 2345+1000 =3345。由于 3345>3123,火灾(3123)等没有任何反应

标签: java scheduled-tasks


【解决方案1】:

你可以这样做......

Runnable helloRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);

在 fire() 方法被调用后调用scheduleAtFixedRate 方法当且仅当它之前没有被调用过。您可以将此信息存储在您班级的isFired 变量中。

【讨论】:

  • 在没有 ScheduledExecutorService 的情况下有没有办法做到这一点?是否可以像我说的那样使用事件的链表?
  • 是的,你可以只保存类中的可运行和延迟。然后你可以在循环中使用 Thread.sleep(delay) 方法周期性地,然后每次唤醒时调用 runnable.run()
猜你喜欢
  • 2019-06-06
  • 2012-02-05
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
相关资源
最近更新 更多