私はちょうどそれ自身のスレッドでこれを行うために使用されるプログラムを持っています:
public void run(){
long lastTime = System.nanoTime();
float lastSleep = 0;
//Everything is in seconds.
while(running){
float delta = (System.nanoTime()-lastTime)/1000000000f;
lastTime = System.nanoTime();
manager.update(delta);
panel.repaint();
lastSleep = Math.max(maxTicSpeed-(delta-lastSleep),5/1000f);
try{
Thread.sleep((long) Math.round(lastSleep*1000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
基本的に、このようにループするときは常にスリープするように教えられていたので、プログラムは少なくとも 5 ミリ秒、または制限を超えずにスリープできる最大時間 (1/30 秒) スリープします。しかし、私は読み回していましたが、睡眠はあまり良いようには聞こえません.
彼の言うことからすると、私のプログラムは、スリープの下限に近づきすぎるとスリープすらしないように思えます。時間の変化を system.printing すると、変化はおよそ .31508 から .03475 の範囲になります。これは、私のプログラムが不正確さを説明しているため、私にとっては十分な値です。
そうは言っても、代わりに何ができますか?try{Sleep} の代わりに次のようなものを追加することを検討していました。
long waitTill = (long) (System.nanoTime()+lastTime/1000000000f),
now = System.nanoTime();
while(now < waitTill){
now = System.nanoTime();
}
しかし、私のスレッドは依然として同じ量のプロセッサー時間を占めているのではないでしょうか? 要点は、スレッドが実際に必要以上にプロセッサを占有しないようにすることだと思いました..
それで、スリープを使用する必要がありますか (最小スリープ時間を長くしますか?)、代替手段を使用する必要がありますか、別の代替手段を使用する必要がありますか? 睡眠の不正確さを考慮しても、プログラミングが不十分ですか?
助けてくれてありがとう!
編集: タイマーが推奨されていますが、タイマーが再度呼び出される前にタスクが終了しなかった場合、問題が発生することを理解しています。それは私のプログラムにとって明確な懸念事項です。デルタを使用して Thread.sleep() の問題に対処したような気がするので、以前の Thread.sleep() の方が良いでしょうか?