私は普通xargs
と並行して実行する科学的アプリケーションを持っていますが、このスキームは繰り返しJVM開始コストを招き、キャッシュされたファイルI/OとJITコンパイラを無視します。私はすでにコードをスレッドプールを使用するように改造しましたが、私は出力を保存する方法についていません。単純な非同期I/O:多くのスレッド、1つのファイル
プログラム(つまり、新しいプログラムの1つのスレッド)は2つのファイルを読み込み、処理して結果を標準出力に出力します。現在は、各スレッドに結果の文字列をBlockingQueue
に追加させることで、出力を処理しました。 Booleanフラグがtrueである限り、別のスレッドはキューから取り出してファイルに書き込みます。その後、私はawaitTermination
とフラグをfalseに設定し、ファイルを閉じてプログラムを終了させます。
私の解決策はちょっと不思議そうです。これを達成するための最も簡単で最良の方法は何ですか? 多くのスレッドの主結果データを1つのファイルに書き込む方法を教えてください。
たとえば、広範に適用可能な方法の場合、答えはJava固有である必要はありません。
更新
私はポイズンピルとして "STOP" を使用しています。
while (true) {
String line = queue.take();
if (line.equals("STOP")) {
break;
} else {
output.write(line);
}
}
output.close();
私は手動でのジョブが終了し、最終的にキューを毒殺し、消費者のスレッドに参加するのを待ち、その後、スレッドプールにジョブを追加し、キューのかかるスレッドを起動します。
このフラグを使用する場合は、静的なブール値フィールドの場合は、必ず「volatile」として宣言してください。それ以外の場合は、フィールドへの読み書きに同期を追加しない限り、動作しません( 'static final AtomicBoolean'も使用できます)。 Anywhere、私はWill Hartungによると "poison pill"スキーマに固執します。 –