2011-11-14 14 views
2

私は現在32スレッドを使用してスレッドごとに1ファイル(32個の.txtファイル)を読み込むプログラムを作成しました。マルチスレッドはCPUの速度とは関係ありませんが、BINGのapiへの32回の呼び出しは1秒間に30回も高速に実行できます。検索クエリのリストを含む各.txtファイル。私はそれがファイルから一度に1行を読むスレッドを作成します。 32個のスレッドをすべて作成し、それらを単一の.txtファイルにポイントすることは可能ですか?1つのファイルを読み込むJavaマルチスレッドアプリケーション

+2

私はビッグテキストファイルを解析しています。これは通常、次のように行います。1人のプロデューサがI/Oを実行し、キューに入れてからキューからジョブを取り出したいと思うほど多くのコンシューマを配置します。独自のプロデューサがtxtファイルを読み込んで、1行に1つのエントリをキューに入れることができます。 – TacticalCoder

答えて

12

プロデューサー/コンシューマーパターンを使用します。ファイルを読み取るスレッドを1つしか持たず、put()を使用して各ライン/コマンドをArrayBlockingQueue(スレッドセーフな読み書き)にプッシュします。

他のすべての32スレッドは、take()を呼び出すことによって同じキューオブジェクトから読み取る必要があります。キューが空の場合はブロックされますが、これはいいです。

このソリューションは、ディスクが本質的にシングルスレッドなので、ファイルを同時に読み取ることで多くのことを得ることができないため、このソリューションが優れています。

+0

ありがとう、それは入力を32の別々のファイルを持つよりもずっと簡単に変更します。 – chrstahl89

0

ファイルを処理するコードを同期することができます。開いたファイルに書き込むたびに、書き込みして閉じます。モニターを使用して実装しても問題ありません。

スレッドセーフであるため、java util loggingも使用できます。ハンドラを実装する場合は、スレッドの安全性の問題を処理するために、ロギングAPIが必要です。

+0

質問には書かれていませんが、これはロギングとは関係ありません。 –

0

これらのスレッドの実装方法によって異なります。それぞれのファイルに独自のリーダーまたは入力ストリームがある場合、おそらく並行読み込みにはあまり問題はありません。 OS上のJVM実装が、入力ストリームがオープンされたときに暗黙的にファイルをロックし、ロックをストリーム間で共有できない場合を除きます。

しかし、正直言って、あなたは多くの不必要な作業をしています。ファイルへのアクセスを別のクラスにカプセル化し、そのインスタンスをスレッドに渡してから、そのクラスに必要な並行処理をさせるほうがずっと良いでしょう。

関連する問題