我正在尝试使用ScheduledExecutorService来安排在实验中组成试验的一系列事件。每个事件都在前一个事件完成后发生(例如,没有并发)。某些事件的时间由程序控制(并且似乎适合scheduleWithFixedDelay)。但是,其他事件的顺序部分取决于用户输入,例如单击按钮。以下是伪代码中的事件概述:
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);
}
非常感谢任何示例或建议。
答案 0 :(得分:0)
由于您尝试运行的代码是连续的,因此您唯一应该使用ScheduledExecutor
的是延迟。
以这种方式思考 - 调度程序允许您获取一段代码并在将来的某个时间运行它。
所以你真正想要的是:
present fixation cross
in 1 second:
remove fixation cross
add stimulus
in 1 second:
remove stimulus
...
等等。
要实现in 1 second:
,请使用以下调度程序:
executor.schedule(callable, 1, TimeUnit.SECONDS)
callable
是某个返回结果的Callable
实例(如果它没有返回任何内容,您也可以使用另一个使用Runnable
的变体)。< / p>