私は現在32スレッドを使用してスレッドごとに1ファイル(32個の.txtファイル)を読み込むプログラムを作成しました。マルチスレッドはCPUの速度とは関係ありませんが、BINGのapiへの32回の呼び出しは1秒間に30回も高速に実行できます。検索クエリのリストを含む各.txtファイル。私はそれがファイルから一度に1行を読むスレッドを作成します。 32個のスレッドをすべて作成し、それらを単一の.txtファイルにポイントすることは可能ですか?1つのファイルを読み込むJavaマルチスレッドアプリケーション
答えて
プロデューサー/コンシューマーパターンを使用します。ファイルを読み取るスレッドを1つしか持たず、put()
を使用して各ライン/コマンドをArrayBlockingQueue(スレッドセーフな読み書き)にプッシュします。
他のすべての32スレッドは、take()
を呼び出すことによって同じキューオブジェクトから読み取る必要があります。キューが空の場合はブロックされますが、これはいいです。
このソリューションは、ディスクが本質的にシングルスレッドなので、ファイルを同時に読み取ることで多くのことを得ることができないため、このソリューションが優れています。
ありがとう、それは入力を32の別々のファイルを持つよりもずっと簡単に変更します。 – chrstahl89
ファイルを処理するコードを同期することができます。開いたファイルに書き込むたびに、書き込みして閉じます。モニターを使用して実装しても問題ありません。
スレッドセーフであるため、java util loggingも使用できます。ハンドラを実装する場合は、スレッドの安全性の問題を処理するために、ロギングAPIが必要です。
質問には書かれていませんが、これはロギングとは関係ありません。 –
これらのスレッドの実装方法によって異なります。それぞれのファイルに独自のリーダーまたは入力ストリームがある場合、おそらく並行読み込みにはあまり問題はありません。 OS上のJVM実装が、入力ストリームがオープンされたときに暗黙的にファイルをロックし、ロックをストリーム間で共有できない場合を除きます。
しかし、正直言って、あなたは多くの不必要な作業をしています。ファイルへのアクセスを別のクラスにカプセル化し、そのインスタンスをスレッドに渡してから、そのクラスに必要な並行処理をさせるほうがずっと良いでしょう。
- 1. ファイルを1行ずつ読み込むときのパフォーマンス対ファイル全体を読み込むときの比較
- 2. ファイルから読み込み、Javaのファイルに書き込む
- 3. Java: "\ n"を無視して1行ずつファイルを読み込む方法
- 4. require.jsで1つの言語のみを読み込むi18n
- 5. pickleファイルを読み込む
- 6. マルチスレッドアプリケーションでファイルにログを書き込む
- 7. 複数のArrayListをJavaの1つのファイルに保存/読み込み
- 8. java読み込み.propertiesファイル
- 9. ストリームを含むファイルを読み込む
- 10. JavaのFileDescriptor .sync()の読み込み*ファイルの読み込み
- 11. 1つのファイルの読み書きと1つのファイルの読み込み専用の分割vimウィンドウ
- 12. パンダ:read_csv(複数のテーブルを1つのファイルに読み込み)
- 13. 複数のテーブルビューからデータを読み込む1つのデータベース
- 14. アンドロイドのjavaで1回の読み込みでファイル全体を読むことはできますか?
- 15. Sencha Touch 2で1つのモデルを読み込む方法は?
- 16. Java - 1行のファイルを読む
- 17. Java WebDriverがページを読み込むのを待つ
- 18. JavaランタイムでLinuxの.soファイルを読み込む
- 19. .wavファイルをJavaのバイト配列に読み込む
- 20. java複数のJTextFieldを.txtファイルから読み込む方法
- 21. java vs scala - 別のスレッドでファイルを読み込む
- 22. Pythonでファイルから1文字を読み込む?
- 23. GWTサーバー側のファイルを読み込む
- 24. Javaファイルの読み込みの問題
- 25. asyncioでファイルを1行ずつ読み込みます
- 26. Unixシェルスクリプトでファイルを1行ずつ(空白で)読み込む - 問題
- 27. USBバーコードスキャナをJavaアプリケーションに読み込む
- 28. XMLでファイルを読み込みJava
- 29. javaファイルの読み込み問題
- 30. Javaでのファイル読み込み
私はビッグテキストファイルを解析しています。これは通常、次のように行います。1人のプロデューサがI/Oを実行し、キューに入れてからキューからジョブを取り出したいと思うほど多くのコンシューマを配置します。独自のプロデューサがtxtファイルを読み込んで、1行に1つのエントリをキューに入れることができます。 – TacticalCoder