1

DataInputStream で read() を呼び出した場合、データを待機するために CPU サイクルが消費されますか?それとも、現在のスレッドを明け渡し、データが到着したことを知らせる割り込みによってウェイクアップされますか?

私の動機は、ストリーム リーダーを独自のスレッドにする必要があるかどうかを判断することです。CPU 時間を消費するブロッキング読み取りは、メイン スレッドがハングアップするため、理想的ではありません。

関連する質問: メソッドがブロッキングとして記述されている場合、待機中にスレッドが解放されることを意味しますか? それとも契約・保証はありませんか?データを常にチェック/ポーリングするメソッドは、まだブロックされているように思えます。

4

4 に答える 4

3

通常、I/O により、データが使用可能になり、他のスレッドが自由に実行できるようになるまで、読み取りスレッドがブロックされます。データが到着すると、リーダーのブロックが解除されます。

ブロッキングとは、他のスレッドが実行されている間、ブロックされたスレッドがブロック解除されるのを待機することを意味します。通常、データのポーリング中にループするビジー待機コードは (Java ランタイムではなく、適切に設計されたコードでは) 見つかりません。

一方で、私が引き継がなければならなかったコードのほぼすべてを見てきました:-(

于 2009-07-15T23:03:05.047 に答える
1

CPU サイクルを消費しませんが、ブロックしているため、他に何も実行されません。

可能であれば、非ブロッキングである Java の NIO を使用してください。それ以外の場合は、別のスレッドを持つことが理想的です。

于 2009-07-15T23:03:02.053 に答える
1

ブロッキングによって占有される一定量のサイクルがあります。スレッドスイッチがあります。役に立たないデータでいっぱいのキャッシュを持つことに関連する問題。おそらく、マルチスレッド マシンでは、コンテキスト スイッチなしでスレッドのブロックをすばやく解除できる場合に備えて、短い期間のスピンがあります。

そのため、わずかなオーバーヘッドがあります。ただし、それが邪魔にならない場合は、問題になることはありません。あなたが使っているという事実DataInputStreamは、ここでもそこでもありません。特定のパフォーマンスの問題が見られる場合は、それらに対処してください。I/O 操作では、CPU パフォーマンスよりも I/O パフォーマンスの方が重要になる可能性があります。

于 2009-07-15T23:44:49.690 に答える
0

スレッドの観点からは(他の回答によると)問題ありません-ブロッキングでのCPU使用はありません/最小限です。

ただし、高い I/O パフォーマンスは期待しないでください。InputStream の読み取りメソッドは同期化され、ブロックされ、すべてのバイトに対して安全性チェックを実行するため、非常に低速です。大量のデータを読み取る場合は、NIO を調べるか、一度に大きな byte[] を読み取ってください。1K ~ 8K が多かれ少なかれ標準です。

于 2009-07-28T01:38:52.663 に答える