【发布时间】:2011-10-02 00:22:09
【问题描述】:
我有一个科学应用程序,我通常与xargs 并行运行,但是这种方案会产生重复的 JVM 启动成本,并且忽略了缓存文件 I/O 和 JIT 编译器。我已经修改了代码以使用线程池,但我一直不知道如何保存我的输出。
程序(即新程序的一个线程)读取两个文件,进行一些处理,然后将结果打印到标准输出。目前,我通过让每个线程将其结果字符串添加到BlockingQueue 来处理输出。只要布尔标志为真,另一个线程从队列中取出并写入文件。然后我awaitTermination并将flag设置为false,触发文件关闭和程序退出。
我的解决方案似乎有点笨拙;实现这一目标的最简单和最好的方法是什么? 我应该如何将来自多个线程的主要结果数据写入单个文件?
如果答案是广泛适用的方法,则不需要特定于 Java。
更新
我正在使用“STOP”作为毒丸。
while (true) {
String line = queue.take();
if (line.equals("STOP")) {
break;
} else {
output.write(line);
}
}
output.close();
我手动启动队列消费线程,然后将作业添加到线程池中,等待作业完成,最后毒化队列并加入消费者线程。
【问题讨论】:
-
如果使用这样的标志,如果是
static boolean字段,一定要声明为volatile!否则它将不起作用,除非您将同步添加到该字段的读/写(您也可以使用static final AtomicBoolean)。 Anyawys,我会坚持使用 Will Hartung 所描述的“毒丸”模式。
标签: java multithreading file-io asynchronous parallel-processing