0

大家好,我有一个关于一串童话灯问题的问题。该程序是要显示一串仙女灯,并无限地遍历灯光对象的集合,打开和关闭它们。

我已经实现了这个在 ScheduledExecutorService 中执行,并将执行器设置为初始延迟为零,再延迟 30 秒

ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
`ScheduledFuture sequenceFutre = executor.scheduleWithFixedDelay(sequenceRunnable, 0, 30, TimeUnit.SECONDS);`

我有这样的灯光数组列表的循环

        try {
        while (!pause) {
            for (int i = 0; i < theLights.size(); i++) {
                Light light = theLights.get(i);
                System.out.println(String.format(outputstr, (i + 1), light.turnOn()));
                Thread.sleep(HALF_SECOND_INTERVAL);
                System.out.println(String.format(outputstr, (i + 1), light.turnOff()));
            }
        }
    } catch (InterruptedException ie) {
        ie.printStackTrace();
    } catch(Error err) {
        err.printStackTrace();
    }

我在这里缺少的部分是包裹在其中的可运行文件似乎不会在 30 秒处停止并在恢复之前等待 30 秒,这是要求。

有人可以帮忙吗?我错过了什么?

4

1 回答 1

3

每次执行都会调用您的可运行run()方法。您不应该在代码中使用 while 循环,您应该在每个序列完成后从 run 方法返回。

更新:

正如 OP 所指出的,一个“运行”应该基于时间长度,所以你的运行方法应该跟踪它已经运行了多长时间。即在 run 方法开始时记录当前时间,然后继续循环直到 30 秒过去,然后从 run 方法返回。

于 2012-07-30T17:37:17.880 回答