スレッドの優先度がThread.sleep(50);
の精度を上げますか?スレッドの優先度とスレッドの精度
私たちが知っているように、あなたは50msのスリープを呼び出すとスレッドは正確ではありませんが、どのような意味でも精度が向上しますか?スレッドがMAX_PRIORITY
と表示されている場合
どのような種類の説明にも感謝します。
スレッドの優先度がThread.sleep(50);
の精度を上げますか?スレッドの優先度とスレッドの精度
私たちが知っているように、あなたは50msのスリープを呼び出すとスレッドは正確ではありませんが、どのような意味でも精度が向上しますか?スレッドがMAX_PRIORITY
と表示されている場合
どのような種類の説明にも感謝します。
スリープの精度は、オペレーティングシステムに依存します。精度を上げるには、別のOSを使用することができます。もう一つのアプローチは眠らない、あなたは忙しい代わりに待つことができます。または、45ミリ秒間スリープ状態になり、5ミリ秒間ビジー状態になることがあります。
1秒間に20回実行する必要があるタスクがある場合は、タスクを次に実行するタイミングを把握し、一定時間待機するのではなく、実行することをお勧めします。あなたは睡眠の間にやってもしばらく時間がかかります。
これはScheduledExecutorService.scheduleAtFixedRateです。
マイクロ秒精度でタスク間でスリープすることができますが(OSがサポートしていると仮定します)、ドリフトしないようにします。
これは当てはまりません。しかし、スレッドの優先順位の影響は、ホストのオペレーティングシステムによって異なります。
これはスレッドの精度には直接関係しませんが、50ミリ秒のスリープ後にMAXプライオリティを指定した場合、JVMは同じMAX優先順位で処理するスレッドを選択します。
はいそれはより正確になります。
それにも関わらず、Java Concurrency In Practiceから、ブライアン・ゲッツによって:
スレッドの優先順位メカニズムは鈍器であり、それは常に変化し、優先順位がありますどのような影響は明らかではありません。スレッドの優先度を上げることは何もしないか、常に優先して1つのスレッドをスケジューリングして、飢餓を引き起こす可能性があります。
スレッドの優先順位を微調整するという誘惑に抵抗するのが一般的です。優先順位を変更するとすぐに、アプリケーションの動作がプラットフォーム固有になり、飢餓のリスクが生じます。奇妙な場所での
Thread.sleep
またはThread.yield
コールの存在によって優先順位の調整やその他の応答性の問題から回復しようとしているプログラムを見つけることができます。したがって
あなた本当にが正確であることであるためにあなたのThread.sleep(50)
が必要な場合は、スレッドの優先順位と再考えるあなたのデザインを変更しません!