Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待ScheduledExecutorService中的事件_Java_Scheduled Tasks - Fatal编程技术网

Java 等待ScheduledExecutorService中的事件

Java 等待ScheduledExecutorService中的事件,java,scheduled-tasks,Java,Scheduled Tasks,我正在尝试使用ScheduledExecutorService来安排一系列事件,这些事件包括一个实验中的试验。每个事件发生在前一个事件完成后(例如,没有并发)。某些事件的时间由程序控制(并且似乎适合于使用FixedDelay进行调度)。但是,其他事件的顺序部分取决于用户输入,例如单击按钮。以下是伪代码中事件的概要: present fixation cross 1 second delay remove fixation cross add stimulus 1 second delay rem

我正在尝试使用ScheduledExecutorService来安排一系列事件,这些事件包括一个实验中的试验。每个事件发生在前一个事件完成后(例如,没有并发)。某些事件的时间由程序控制(并且似乎适合于使用FixedDelay进行调度)。但是,其他事件的顺序部分取决于用户输入,例如单击按钮。以下是伪代码中事件的概要:

present fixation cross
1 second delay
remove fixation cross
add stimulus
1 second delay
remove stimulus
for(question in questions){
  presentQuestion(question);
  wait until button click
  clearQuestion(question);
  1 second delay
}
我能够使用scheduleWithFixedDelay实现到for循环的任务。我被困在试图将其余的事件合并起来。以下是我到目前为止的情况:

private void Schedule(){
    executor = Executors.newScheduledThreadPool(1);
    Runnable task = () -> {
        try {
            if(trial > Ntrials){
                stopSession();
                executor.shutdown();
                return;
            }
            addCross();
            TimeUnit.MILLISECONDS.sleep(1000);
            removeCross();
            addStimulus();  
            TimeUnit.MILLISECONDS.sleep(1000);
            removeStimulus();

        }
        catch (InterruptedException e) {
            System.err.println("task interrupted");
        }
        System.out.println("Shutdown");
        executor.shutdown();
    };
    executor.scheduleWithFixedDelay(task, 0, 1, TimeUnit.MILLISECONDS);

}

任何例子或建议都将不胜感激

由于您试图运行的代码是连续的,因此您唯一应该使用
ScheduledExecutor
的就是延迟

这样考虑一下-调度器允许您获取一段代码并在将来某个时间运行它

所以你真正想要的是:

present fixation cross
in 1 second:
  remove fixation cross
  add stimulus
  in 1 second:
    remove stimulus
    ...
等等

要在1秒内实现
,请按如下方式使用调度程序:

executor.schedule(callable, 1, TimeUnit.SECONDS)

其中
callable
是返回结果的
callable
的某个实例(如果不返回任何内容,也可以使用使用
Runnable
的另一个变量)。

由于您尝试运行的代码是连续的,因此您唯一应该使用
ScheduledExecutor
作为延迟

这样考虑一下-调度器允许您获取一段代码并在将来某个时间运行它

所以你真正想要的是:

present fixation cross
in 1 second:
  remove fixation cross
  add stimulus
  in 1 second:
    remove stimulus
    ...
等等

要在1秒内实现
,请按如下方式使用调度程序:

executor.schedule(callable, 1, TimeUnit.SECONDS)


其中
callable
是返回结果的
callable
的某个实例(如果不返回任何内容,也可以使用使用
Runnable
的另一个变量)。

不同的步骤是否取决于之前完成的步骤?是。至少在某种意义上,他们遵循概述的顺序,在问题呈现(for循环)过程中,每个问题在按钮点击和1秒延迟后单独呈现。这说明了一切吗?为了进一步说明,每一步都取决于前一步是否完成。所以一切都是连续的,不重叠的。很抱歉。如果是这样,我会说你设计得太过分了。唯一应该使用调度程序的是第二次延迟。Ok。我懂了。我对日程安排相当陌生,对各种可用的方法有点不知所措。您能否提供一个固定延迟和基于事件的延迟的最小工作示例(例如,点击按钮后进入下一步?谢谢。不同的步骤是否取决于之前完成的步骤?是的。至少在遵循概述的顺序和在问题演示(for循环)过程中是这样的每个问题在点击按钮并延迟1秒后单独提出。这是否澄清了所有问题?进一步澄清,每个步骤取决于前一步是否完成。因此,所有问题都是连续的且不重叠。对此表示抱歉。如果是这样,我会说您设计过度。您唯一应该使用的是scheduler是第二个延迟。好的。我明白了。我对调度相当陌生,对可用的不同方法有点不知所措。你能提供一个固定延迟和基于事件的延迟的最小工作示例吗(例如,点击按钮进入下一步?谢谢。谢谢。我想我明白了。看起来您建议从executor.schedule调用每个事件的方法,而不是像我上面所做的那样从可运行的方法调用。您是否有任何建议基于事件进入下一步,例如点击按钮?哪种机制nism用于呈现问题/获取答案吗?每个问题都以文本形式呈现,并带有一个JLabel。在JLabel下方,我有一个JSlider,用户可以在其中以滑动比例输入判断。选择JSlider值后,用户通过单击JSlider下方的JButton提交响应。JButton已添加到一个动作监听器。那么,这就是你的答案。在onClick代码中,你必须使用相同的执行器等等。你可以在创建监听器时提供它们作为依赖项。谢谢。高级工作流是有意义的。我想我的问题的关键是实现的细节。从在我收集时,callable(与runnable相反)返回一个结果。但我不知道如何使用该结果阻止executor.schedule从actionPerformed运行。我是否调用future.cancel(true)从actionPerformed,future是ScheduledFuture的实例还是其他什么?谢谢。我想我明白了。看起来您建议从executor.schedule调用每个事件的方法,而不是像我上面所做的那样从runnable调用方法。您有什么建议根据事件推进下一步,例如作为按钮点击?您使用哪种机制来呈现问题/获取答案?每个问题都以文本形式呈现,并带有一个JLabel。在JLabel下方,我有一个JSlider,用户在其中输入滑动比例的判断。一旦选择了JSlider值,用户通过单击JSlider下方的JButton提交响应。JButton已经添加到动作监听器中。那么,这就是你的答案。动作监听器会在单击时被调用。在onClick代码中,你必须使用相同的执行器等等。你可以在创建监听器时提供它们作为依赖项。谢谢。高级工作流很有意义。我想我的问题的关键是细节根据我收集的信息,callable(与runnable相反)返回一个结果。但我不知道如何使用它来阻止executor.schedule从actionPerformed运行。我会调用f吗