23

whileループを特定のミリ秒数だけ一時停止する必要があります。Thread.sleep(duration)を使用してみましたが、特にループシナリオでは正確ではありません。私のプログラムではミリ秒の精度が重要です。

expectedElapsedTimeこれが、通過するまで状態をチェックするために戻りたくないアルゴリズムです。

while (condition) {
    time = System.currentTimeMillis();
    //do something
    if (elapsedTime(time) < expectedElapsedTime) ) {
        pause the loop  // NEED SUBSTITUTE FOR Thread.sleep()
    }
    // Alternative that I have tried but not giving good results is 
    while ((elapsedTime(time) < expectedElapsedTime)) {
        //do nothing
    }
}

long elapsedTime(long time) {
   long diff = System.currentTimeMillis() - time;
   return diff;
}
4

7 に答える 7

10

あなたは何を期待していますか?

スリープ状態になった場合、プロセスが再び実行可能になると、スレッド スケジューラが再度スケジュールするまで待機する必要があります。

つまり、50 秒間スリープ状態になったとしても、プロセスが正確に 50 秒で実行されるという意味ではありません。コンテキストスイッチのために持っています。

それを制御するためにできることは何もないので、あなたが言っている正確さを得ることができません。

あなたの場合、代わりに回転ループをお勧めします。

long now = System.currentTimeMillis();   
while(now < expectedElapsedTime){
    now = System.currentTimeMillis();
}
于 2012-02-04T19:26:16.590 に答える
7

Java はリアルタイム システムではありません。このようなタイトなスケジュールの中で、スレッドをいったん終了させて​​戻すことはできません。プログラムの実行をミリ秒単位でスケジュールするには、simpleRTJJava Real-Time extensionなどの別のプラットフォームを使用する必要があります。

于 2012-09-17T20:34:18.063 に答える
2

遅延は任意に選択される可能性が高いので、リアルタイムの間隔のタイミングが必要かどうか疑問に思います。

読み取り時間が必要な場合は、時間に達するまで忙しく待つ必要があります。CPUをあきらめるということは、必要なときに正確にCPUを取り戻すことを保証できないことを意味します。

于 2012-02-04T19:47:47.697 に答える
1

サウンドを正確にしたい場合は、シーケンサーを使用して BPM でテンポを設定します。

于 2014-03-03T20:05:15.803 に答える
1

解決策は、ランナブルでハンドラーを使用し、メソッド「postDelayed」を使用することです。例:

new Handler().postDelayed(new Runnable() {
public void run () {
    // Do delayed stuff!
}
}, 5000L); //5 seconds delay 

https://stackoverflow.com/a/21680858

于 2014-12-13T18:09:18.577 に答える
1

待機/通知メカニズムを実装し、待機状態にある他のスレッドに時間が経過し、先に進むことができることを通知する責任を別のスレッドに委任できます...

たとえば、threadA が一定時間待機する必要がある場合、スレッドを待機状態にして、タイマー タスクを開始し、一定時間 (間隔) 後に通知を呼び出し、先に進む ThreadA をウェイクアップすることができます。代わりになる。

于 2012-02-04T19:29:25.037 に答える