2010-12-20 15 views
2

システムクロックに依存しない方法でスレッドを一時停止/スリープさせる方法が必要です。つまり、スレッドがdTミリ秒で弱くなるようにするには、この時間の間にシステム時間が大幅に変化した場合でもそうする必要があります。私はmsecs以上の精度にはあまり関心がありません。Javaシステムクロック独立したスケジューリング/ポーズ

TimerTasksは絶対時間で動作するためオプションではありません。

答えて

0

私はあなたの質問を正しく理解しているかわかりません。タスクスケジューラが必要な場合、Quartzはかなり良いです。あなたが実際にx時間以上の任意のスレッドを一時停止したいのであれば、それはやや難しいかもしれません。

1

トリッキー....それは、システムクロックでも、任意の戦略のために使用されているかどうかを知るのは難しいです。ただし、クロックを回避するには、スレッドの一時停止中に時刻が変更される可能性がありますが、System.nanoTime()は、JVMの起動以降の純粋なナノ秒数なので、現在時刻とは関係ありません。したがって、ポーズ戦略がナノを使用する場合、ポーズ期間がシステムクロック時間の変更によって精度を保持すると仮定してもよい。おそらく、ループ内で呼び出さThread.join(0、またはnanos):

public static void pause(long ms) throws InterruptedException { 
    long final ZERO = 0L; 
    int final MAX_NANOS = 999999; 
    for(int i = 0; i < ms+1; i++) { 
     Thread.currentThread().join(ZERO, MAX_NANOS); 
    } 
} 

は、私は、システムクロックの変更をテストしていないが、0.004パーセント偏差内で実行するように見えます。

関連する問題