数百万の単位計算を実行するJavaプログラムを書いています。各ユニットは約1秒かかるため、全体としては数日で完了します。各単位を計算した後、いくつかの結果(数行のテキスト)をファイルに書き込みたいと思います。ファイルの書き込みには時間がかかるので、ファイルを書き込むための別のスレッドを作成する必要があるのではないかと思います。そうすれば、メインの計算が妨げられることはありません。
ありがとうございました。
エキゾチックなOSではなく、主流のOSで実行していると思います。書き込みを行うだけで、書き込みをFileOutputStream
行わないflush()
場合、データはおそらくメモリバッファに書き込まれますが、これにはほとんど時間がかかりません。ディスクへの実際の書き込みは後で非同期的に行われるため、気にしないでください。
ファイルの書き込みにはほとんど時間がかかりません。読み取り時とは異なり、書き込みを行うスレッドは、実際のディスク I/O 操作が完了するまで待機する必要はありません。
書き込みのサイズが非常に大きくない限り、各ユニットをインラインで計算した後、後でスレッドについて心配しながらディスクに書き込むだけです。おそらく、計算を行うのではなく、ディスクへの書き込みにかなりの割合の時間を費やしていることを実際に知った後です。 .
ただし、本当に別のスレッドで実行する必要がある場合は、固定サイズのエグゼキューターを使用してください。
// somewhere during initialisation
ExecutorService threadPool = Executors.newFixedThreadPool(1);
// after each unit
final Unit unit = null; // your stuff
threadPool.submit( new Runnable() {
public void run() {
try ( FileOutputStream fos = new FileOutputStream(yourFileHere, true) ){
fos.write( unit.toBytes() );
} catch ( IOException e) {
// guess you need to handle this ??
}
}
});
// do make sure that when you finish you call
// to wait for tasks to finish
threadPool.shutdown();
Java Logging APIまたはLog4Jなどのロギング フレームワークを簡単に使用できます。
スレッドが終了する直前に、ログ ファイルに情報を書き込むことができます。スレッドセーフであり、実質的にまったく時間がかかりません。
Java 7 は非同期 IO を追加するので、これらの API を使用して計算と結果保存タスクを切り離すことができますが、他の人が指摘しているように、必要と思われるディスク IO の量を考えると、おそらくやり過ぎです。