0

こんにちは、一連のフェアリー ライトの問題について質問があります。プログラムは、一連のフェアリー ライトを表示し、ライト オブジェクトのコレクションを無限に調べて、それらをオン/オフすることです。

これを ScheduledExecutorService 内で実行するように実装し、executor の初期遅延を 0 に設定し、さらに 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が示したように、1回の「実行」は時間の長さに基づく必要があるため、実行メソッドは実行されている時間を追跡する必要があります。つまり、run メソッドの開始時に現在の時刻を記録し、30 秒が経過するまでループを続けてから、run メソッドから戻ります。

于 2012-07-30T17:37:17.880 に答える