我正在编写一个执行数百万单位计算的 Java 程序。每个单元大约需要 1 秒,因此总体上需要几天时间才能完成。在计算每个单元之后,我想将一些结果(几行文本)写入文件。由于写入文件需要时间,我想知道我是否应该创建一个单独的线程来写入文件,这样它就不会阻塞主计算。
谢谢你。
我假设您在主流操作系统上运行,而不是在异国情调的操作系统上运行。如果你只是写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 数量,这可能是矫枉过正。