テキストファイルを読み取ってから変換し、他のファイルに書き込む必要があるという要件があります。読み取り用のスレッド、変換用のスレッド、書き込み用のスレッドのように、これを並行して実行したいと考えています。
スレッド間でデータを共有するには、いくつかのチャネルが必要です。これに使用することを考えていBlockingQueue
ましたが、利用可能な場合は他の (より良い) 代替手段を検討したいと考えています。
Guava にはEventBus
要件がありますが、これが要件に適しているかどうかはわかりません。他にどのような選択肢があり、パフォーマンスの観点からどれが最適か。
1 に答える
2
変換ステップが非常に集中的でない限り、これはおそらく時間の無駄です。
このように考えてください。あなたは何を求めていますか?
あなたは何かを求めています
- データの受信ストリームを受け取ります
- 別のスレッドにコピーします
- データの着信ストリームとしてそのスレッドに提示します
ステップ 3 の受信データ ストリームを最もよく表すデータ構造はどれですか? (ヒント: それはあなたが始めた InputStream です!)
最初の 2 つのステップはどのような価値をもたらしますか? 「変換」スレッドは、別のスレッドを介してディスクから読み取るのと同じ速度でディスクから読み取ることができます。間にスレッドを追加しても、ディスクの読み取り速度は向上しません。
次のときに別のスレッドを追加することを検討し始めます
- 問題は、独立した作業に分割することができます(たとえば、各スレッドはテキストのチャンクで作業します)。
- 問題をこれらの作業に分割するコストは、追加のスレッドを追加してそれらの間で調整するオーバーヘッドよりも大幅に小さくなります (これは小さいですが、無料ではありません!)。
- この問題には、単一の CPU が提供できるよりも多くのリソースが必要です (スレッドにより、より多くの CPU リソースにアクセスできますが、I/O スループットに関してはあまり価値がありません)。
于 2012-02-08T08:10:18.307 に答える