2009-07-15 10 views
1

DataInputStreamでread()を呼び出すと、データを待っているCPUサイクルを消費するか、現在のスレッドが生成され、データが到着したことを通知する割り込みによって呼び起こされますか?java:d​​atainputstream:データを待つ間に読み込み呼び出しがプロセッサ時間を消費するか?

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

関連する質問:メソッドがブロッキングとして記述されている場合、待機中にスレッドが生成されることは暗黙のことですか?または契約/保証はありませんか?常にデータがブロックされているかどうかをチェック/ポーリングする方法です。

答えて

1

CPUサイクルを消費することはありませんが、ブロックされているため、何も実行されません。

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

3

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

ブロッキングとは、ブロックされたスレッドがブロック解除されるのを待つことを意味し、他のスレッドは実行されます。 一般的には、データをポーリングするときにループするビジー待機コード(よく設計されたコードであり、Javaランタイムではありません)を見つけることができます。

一方

、私はちょうど私がブロックすることにより取り込まれるサイクルの一定量があり

1

:-(引き継ぐために持っていたコード内のすべてについて見てきました。ありマルチスレッドマシンでは、スレッドをコンテキストスイッチなしで素早くブロック解除できるようにするため、短時間の回転があります。

このように、小さなビットがあります。オーバーヘッド。しかし、一度それが外れてもそれは問題ではありません。DataInputStreamを使用しているという事実はここにもそこにありません。それら。 I/O操作のCPUパフォーマンスよりもI/Oパフォーマンスが重要になる可能性があります。

0

スレッドの観点からは問題ありません(その他の回答によると) - ブロッキングでCPUを最小限に抑えてください。

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

関連する問題