tasks
というLinkedBlockingQueue
がありますが、tasks.take()
と呼び出してタスクが利用可能になるまで待つと、CPU使用率は100%になります。私は(すべてのスレッドが独自のtasks
変数を持っている)tasks.take()
メソッドを使用して複数のスレッドを持っています。誰がなぜこれが起こっているのか知っていますか?新しいタスクに巨大なCPUインパクトLinkedBlockingQueue
this.tasks.offer(task);
を提供するタスク
ComputerTask task = tasks.take();
コードを取るために、コードtasks
変数
private LinkedBlockingQueue<ComputerTask> tasks;
// snip
this.tasks = new LinkedBlockingQueue<ComputerTask>(100);
の
Defenition
P.S.これが私のJavaのバージョンで問題になっているかどうかは分かりません。なぜなら、他のどのコンピュータでもこれをテストしていないからです。
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-413-11M3623)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-413, mixed mode)
おそらく、はい、何も作業を推進していないとキューが空になりますか?もしそうなら、それは間違いなく、ループしている消費者スレッドです、それは確実に壊れました! –
はい。キューは空です.0.2秒ごとにいっぱいになりません。それが再び満たされるまでに数分かかることがありました。それは問題なのでしょうか?しかし、それはプログラムの重要な部分です、私は本当にそれを取り除くことはできません。どんな勧告? – Robbietjuh
@Robbietjuh CPUが増えた場所をさらに評価することをお勧めします。たとえば、生産者がいなくても、10本の糸をテイクの上に置くだけです。それでもCPUの増加が見える場合は、別の機能を持たずに同じことをする単純なアプリケーションを作成することを証明するために、別の場所に問題があります。標準のJDKを使用していて、単にLBQで 'take'しているのであれば、CPUの使用量はありません。 –