スレッドにメインループがあり、アイドルブール値が真であるかどうかテストします。そうであれば、ループの繰り返しごとにThread.sleep(1)
を呼び出します。これをやり遂げるのは効率的な方法ですか?私の目標は、アイドル時にスレッドがCPU使用量を最小限に抑えることです。Javaでは、アイドル状態のスレッドにThread.sleep(1)を使用するのが効率的ですか?
答えて
いいえ。Object.wait
を代わりに使用して、ブール値を含むオブジェクトで同期していることを確認してください。同期しておらず、boolean
がvolatile
でない場合は、メモリバリアがないため、ポーリングスレッドにboolean
への変更が表示されるという保証はありません。 javadocによると
:
このメソッドは、このオブジェクトの待機セットに自身を配置すると、このオブジェクト上の任意およびすべての同期の請求を放棄する(Tそれを呼び出す)現在のスレッドが発生します。 スレッドTは、スレッドのスケジューリングに関して無効になり、4つのいずれかが起きるまで待機します。
は
- 他のスレッドがこのオブジェクトの
notify
メソッドを呼び出し、Tは、スレッドが起こされるよう任意に選択することを起こるスレッド。- 他のスレッドは、このオブジェクトに対して
notifyAll
メソッドを呼び出します。- 他のスレッドがスレッドT.
- を中断...
通知されるのを待っている間、そのスレッドにはCPUを負いません。
以下のコードは、あなたのmain
メソッドが呼び出すことができwaitUntilIdle
方法と別のスレッドで呼び出すことができsetIdle
方法と簡単なアイドルフラグです。
public class IdleFlag {
private boolean idle;
public void waitUntilIdle() throws InterruptedException {
synchronized (this) {
while (true) {
// If the flag is set, we're done.
if (this.idle) { break; }
// Go to sleep until another thread notifies us.
this.wait();
}
}
}
public void setIdle() {
synchronized (this) {
this.idle = true;
// Causes all waiters to wake up.
this.notifyAll();
}
}
}
これはうまくいくものですが、同期外のwhile(true)の理由は何ですか?それはちょうどロックを解放し、待ってから再獲得することになります。シンク内に 'while(true)'を持つことに加えて、待機が通知されるたびに(定期的にまたは偽りに)セマンティクスを取得/解放します(1回のみ)。 –
私の主張は、あなたが余分なリリースを受けることのないシンク内では簡単に「中」できることです。あなたは正常ですが、機能上の害はなく、パフォーマンスへの影響はごくわずかです。 –
@JohnVint、良い点。編集されました。 –
私は@マイクサミュエルに同意し、まだ私はちょうど5
具体的には、Javaで導入されたもので、彼のロックを置き換えるマイクのパラダイムであなたがconcurrent lock packages...
続行使用することをお勧めしたいと思いますCondition'sメソッドを待つことができます - タイムアウトをとるメソッド。そうすることで、例えば、非常に頻繁にメッセージを記録することができます。これは、無限の待機をデバッグするのに役立つメッセージです。タイムアウトを待っている場合は、ロールバックロジックを実行することもできます。
- 1. 状態チェックは常に効率的なものですか?
- 2. QtでGUIスレッドがアイドル状態のときにSIGNALを発行しますか?
- 3. Windowsサービスがアイドル状態でシャットダウンする
- 4. はThread.Sleep(Timeout.Infinite)です。 while(true){}よりも効率的ですか?
- 5. アイドル状態のワーカープロセスのIISシャットダウンを無効にする問題?
- 6. マルチプロセッサ用のCPUがアイドル状態で安定しています
- 7. オブジェクトデータストリームまたはプリミティブデータストリームをJavaで使用する方が効率的ですか?
- 8. 最も効率的なJavaスレッド技術ですか?
- 9. Thread.sleepを使用してスレッドがスリープ状態になっているときのCPU消費
- 10. アイドル状態でpythonをインストールするには?
- 11. Celeryはローカルシステムで効率的ですが、Pythonのマルチプロセッシングは効率的ですか?
- 12. Java:GraphicsでsetClipを使用する方が効率的ですか?
- 13. XCTestCase:アプリケーションがアイドル状態になるのを待ちます。
- 14. MDIアプリケーションがアイドル状態で100%CPUを消費する
- 15. Java:使用済みのオブジェクトを効率的に追跡する
- 16. 状態モナドを使用するか、状態を再帰的に渡す方が良いですか?
- 17. Seamを開始するContext数秒間アイドル状態にしても何度もアイドル状態になる
- 18. 1から100までの90%で効率的にソートする
- 19. アレイリストを使用する方が効率的ですか?
- 20. 目的C:ユーザーのアイドル状態に関する通知を取得する
- 21. JavaScriptでアイドル状態でアクションを実行する
- 22. アイドル状態のCPUを使用してWebサーバのクラスタを形成する
- 23. Thread.Sleep(1)の目的は?
- 24. NSDataを効率的に使用する
- 25. ページがアイドル状態のときにJavaScriptでJavaScriptを有効または無効にするにはどうすればいいですか?
- 26. WCFデュプレックスクライアントのアイドル状態の更新ユーザーインターフェイス
- 27. マルチスレッド環境でRestTemplateを効率的に使用するには?
- 28. Javaスレッド - CPU使用率は高いですか?
- 29. iOSアプリケーションがアイドル状態でロックしています
- 30. 状態がRUNNINGのJavaでスレッドを強制終了するにはどうすればよいですか?
システムがスレッドを常にこのようにスワップするのに時間がかかりませんか?それは、スレッドマネージャがその仕事をするための処理能力を必要とし、ミリ秒ごとにその仕事をするように求めています。 – scriptocalypse
それは私が起こるかもしれないと思われるものの1つですが、私は当時は分かりませんでした。 'wait'のように聞こえ、' notifyAll'は仕事をうまくやってくれます。 – AutoBotAM