gpt4 book ai didi

java - 运行计划任务链

转载 作者:行者123 更新时间:2023-12-01 11:28:01 25 4
gpt4 key购买 nike

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

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

现在我需要在任务1之后运行任务1到100毫秒,在任务1之后运行任务2到9毫秒,在任务2之后运行任务3到22毫秒等等。

  • 我正在使用 javafx。任务可以使用一些 UI 更新方法,例如更改节点位置。这迫使我使用 Platform.runLater() 方法,因为如果我不这样做,那么我将遇到“不在 FX 应用程序线程上”的异常。据我所知,此方法会在未定义的时间后运行 Runnable 对象。根据时间的变化程度,我有两种方法。

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

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

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

    我认为这里的代码不太有用,因为它很困惑,而且有点大,无法快速弄清楚

    最佳答案

    假设实际任务本身(不包括延迟)运行时间并不长(因此它们可能在 FX 应用程序线程上完整执行),您可以使用时间轴如下:

    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 应用程序线程上执行(但它们之间的暂停不会阻塞该线程)。

    关于java - 运行计划任务链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649822/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com