0

無限ループを何度も実行する Java コードがあり、特定の条件下で、追加のステップ/関数呼び出しをループに挿入したいと考えています。

これらの変数をループの外で定義しました。

static boolean wait_activate = false; 
static long wait_tmr = -1; 
static int wait_delay = 6; 

次に、無限ループで、追加のコードを有効にしたい場合:

if (some-condition) { 
    wait_activate = true; 
    System.out.println("activate"); 
    wait_tmr = (System.currentTimeMillis() / 1000L); 
}

ループの開始時に、追加のコードを挿入するための 2 つのチェックがあります。

if (wait_activate && (wait_tmr + wait_delay) < (System.currentTimeMillis() / 1000L)) {
    // if wait period isn't over
    do_additional_stuff(); 
}

if (wait_activate && (wait_tmr + wait_delay) > (System.currentTimeMillis() / 1000L)) {
    // wait time is over: 
    System.out.println("Reset time: " + wait_delay); 
    System.out.println("Stored time: " + wait_tmr); 
    System.out.println("Current time: " + (System.currentTimeMillis() / 1000L)); 
    wait_activate = false; 
    wait_tmr = -1; 
}

現在、時間の値はすべて秒 / unixtime です。(currentTimeMillis / 1000 = 秒)。wait_delayは 6 です。つまり、2 つprintlnの s は ( で) アクティブ化してから約 6 秒後にのみ実行する必要がありますwait_activate = true

ただし、出力は次のとおりです。

activate
Reset time: 6
Stored time: 946685043
Current time: 946685045

理由がわかりません。によると、6 秒待つ必要がありwait_delayます。ただし、保存された時刻と現在の時刻の差はわずか 2 秒です。wait_delay を増やしても。私は何か間違ったことをしていますか?これは Java のバグですか、それとも私が (しなければならない) 使用している (これを LEGO EV3 の LeJOS 0.9.0-beta で実行している) 奇妙な JRE バージョンのバグですか?

私は完全な「初歩的な間違い」を犯していて、それを見ていないのでしょうか? それとも何か他のものが壊れていますか?

4

2 に答える 2

0

wait_activate がオンになっている間、無限ループ内で以下の割り当てが何度も発生したくない場合があります。条件が役立つ場合は、この割り当てを正しくラップしてください。

wait_tmr = (System.currentTimeMillis() / 1000L);

于 2018-02-09T07:25:31.653 に答える