ループが常にキューをリッスンし、メモリ内のカウントをインクリメントするwhile(true)が必要なシステムで作業しています。
データは常にキューに入っているので、while(true)状態を回避することはできません。しかし、当然、CPU使用率は100%に増加します。
では、キューの末尾をリッスンして何らかのアクションを実行するスレッドを存続させながら、同時にCPU使用率を100%に減らすにはどうすればよいでしょうか。
ループが常にキューをリッスンし、メモリ内のカウントをインクリメントするwhile(true)が必要なシステムで作業しています。
データは常にキューに入っているので、while(true)状態を回避することはできません。しかし、当然、CPU使用率は100%に増加します。
では、キューの末尾をリッスンして何らかのアクションを実行するスレッドを存続させながら、同時にCPU使用率を100%に減らすにはどうすればよいでしょうか。
ブロッキングキューは、まさにこの目的のために考案されました。
こちらもご覧ください:Javaでキューをブロックする利点は何ですか?
LinkedBlockingQueue.take()は、使用する必要があるものです。これは、追加の同期メカニズムを必要とせずに、エントリがキューに到着するのを待ちます。
(Java、IIRCには他に1つまたは2つのブロッキングキューがありますが、一般的な場合には不適切な機能があります。なぜこのような重要なメカニズムが難解なクラスに深く埋もれているのかわかりません。)
通常、キューにはアイテムを取得する方法があり、キューに何かが到着するまでスレッドのスケジュールが解除されます(したがって、0%のCPUを使用します)。
別の回答に対するコメントに基づいて、hsqldbの変更に基づくキューが必要です。
いくつかの簡単なグーグルが現れます:
http://hsqldb.org/doc/guide/triggers-chapt.html
変更によってトリガーが発生するように設定できるようです。トリガーは、org.hsqldb.Trigger
インターフェースを実装して作成したクラスに通知します。そのクラスLinkedBlockingDequeue
にJavaのConcurrentパッケージからのへの参照を含め、トリガーに変更をキューに追加させます。
これで、hsqldbが(ライターによる更新から)トリガーを起動してキューに何かを入れるまで、読み取りスレッドがブロックするブロックキューができました。その後、待機中のスレッドはブロックを解除し、アイテムをキューから外します。
lbalazscsとBrainには優れた答えがあります。私は自分のコードを共有できませんでした。彼らが私の問題の正確な修正を彼らに与えるのは困難でした。そして、キューを絶えずポーリングするwhile(true)を持つことは、間違いなくそれを回避するための間違った方法です。だから、これが私がしたことです:
ScheduledExecutorService
は10秒の遅延で使用しました。 これにより、CPU使用率が大幅に削減されます。提案を歓迎します。
本を読んで学校で時間を無駄にしているだけの人々からの多くのばかげた答えは、私が見るほど多くの直接的な論理や答えではありません。
while(true)は、Windowsアルゴリズムによって基本的に「割り当てられた」すべてのCPUパワーを使用して、ループ内にあるものを、通常は可能な限り高速に繰り返し実行するようにプログラムを設定します。これは、アプリケーションで100%と表示されている場合、ゲームを実行すると、空のループ.exeがすべてのOS CPUパワーを消費し、ゲームが意図したとおりに実行されることを意味するものではありません。これは、Windowsのアイドルプロセスやその他のプロセスに似た、視覚的なバグのようなものです。修正は、Sleep(1)(少なくとも1ミリ秒)以上、さらにSleep(5)を追加して、他のものを実行できるようにし、CPUがwhile(true)を可能な限り速くループしないようにすることです。これにより、通常、ビジュアルキューでCPU使用率が0%または1%に低下します。これは、1ミリ秒が古いCPUにとっても大きな休止時間であるためです。
多くの場合、while(trues)または一般的な無限ループは不適切な設計であり、Sleep(1000)-1秒間隔チェック以上にまで大幅に遅くなる可能性があります。無限ループは必ずしも悪い設計ではありませんが、通常は改善できます。
このバグを見て面白いのは、私が12の学習Cのようなもので、すべての「ばかげた」答えが与えられたときに学んだことです。
あなたがそれを試してみるかどうかを知っておいてください、あなたが使用することを学んだスクリプト化された遅い言語がそれ自体でそれをどこかで修正しない限り、OSが実際に空きリソースを持っているときにWindowsは空のループを行う際に多くのCPUを使用すると主張します費やす。