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