等到ScheduledExecutorService

时间:2017-08-27 12:55:20

标签: java scheduled-tasks

我正在尝试使用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);

}

非常感谢任何示例或建议。

1 个答案:

答案 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>