运行 计划任务链

Run scheduled tasks chain

  1. 我需要 运行 个计划任务,在执行上一个任务后具有不同的延迟。 例子。有一个任务列表和延迟列表。

    toRun = {task1, task2, ..., taskn}
    delays = {100, 9, 22, ..., 1000}
    

现在我需要 运行 task1 到 100ms,task2 在 task1 之后到 9ms,task3 在 task2 之后到 22ms 等等。

  1. 我正在使用 javafx。任务可以使用一些 UI 更新方法,例如更改节点位置。这迫使我使用 Platform.runLater() 方法,因为如果我不这样做,那么我将有一个异常 "Not on FX application thread"。据我所知,此方法在未定义的时间后 运行s Runnable 对象。根据时间的变化,我有两种方法。

    2.1 如果调用时间<1-2ms,继续使用Platform.runLater()方法。

    2.2 寻找另一个解决方案,我还没有。

关于实际任务的简短说明。我记录用户操作,如鼠标移动、鼠标单击和一些应用程序事件。之后我需要重播这些动作。因此,我使用 ScheduledExecutorService.schedule() 完成每个操作,并在每个操作任务中将下一个任务放入调度程序。每次都会出问题,或者感觉不够稳定。

我认为这里的代码不是很有用,因为它很乱,而且有点大,需要快速弄清楚

假设实际任务本身,不包括延迟,不会花费很长时间运行(因此它们可能会在 FX Application Thread 上完整执行),您可以使用 Timeline如下:

Runnable[] tasks = { /* task1, task2, ..., taskN */ } ; // N elements
int[] delays = { 100, 9, 22, ..., 1000 }; // N-1 elements (delay after task1, ..., task(N-1)

KeyFrame[] frames = new KeyFrame[tasks.length] ;
int cumulativeMillis = 0 ;
for (int i = 0; i < tasks.length; i++) {
    frames[i] = new KeyFrame(Duration.millis(cumulativeMillis), event -> tasks[i].run());
    if (i < delays.length) {
        cumulativeMillis += delays[i] ;
    }
}
Timeline timeline = new Timeline(frames);
timeline.play();

使用这种方法,无需担心多线程:Timeline 会为您处理线程问题。每个任务都在 FX 应用程序线程上执行(但它们之间的暂停不会阻塞该线程)。