加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 简单的异步I / O:许多线程,一个文件

发布时间:2020-12-15 08:41:52 所属栏目:Java 来源:网络整理
导读:我有一个科学的应用程序,我通常与xargs并行运行,但这种方案会导致重复的JVM启动成本,并忽略缓存的文件I / O和JIT编译器.我已经调整了代码以使用线程池,但我仍然坚持如何保存输出. 程序(即新程序的一个线程)读取两个文件,进行一些处理,然后将结果打印到标准输
我有一个科学的应用程序,我通常与xargs并行运行,但这种方案会导致重复的JVM启动成本,并忽略缓存的文件I / O和JIT编译器.我已经调整了代码以使用线程池,但我仍然坚持如何保存输出.

程序(即新程序的一个线程)读取两个文件,进行一些处理,然后将结果打印到标准输出.目前,我通过让每个线程将其结果字符串添加到BlockingQueue来处理输出.只要布尔标志为真,另一个线程从队列中取出并写入文件.然后我awaitTermination并将标志设置为false,触发文件关闭并退出程序.

我的解决方案似乎有点笨拙;实现这一目标的最简单,最好的方法是什么?
如何将主要结果数据从多个线程写入单个文件?

如果答案是广泛适用的方法,则答案不需要特定于Java.

更新

我正在使用“停止”作为毒丸.

while (true) {
    String line = queue.take();
    if (line.equals("STOP")) {
        break;
    } else {
        output.write(line);
    }
}
output.close();

我手动启动队列消耗线程,然后将作业添加到线程池,等待作业完成,最后中毒队列并加入使用者线程.

解决方法

这就是你想要的方式,让线程将它们的输出放到队列中然后让编写器耗尽它.

你可能想要做的事情只是让事情变得更清洁,而不是检查一个标志,只需将一个“全部完成”的标记放在队列上,作者可以使用它来知道它已经完成.这样就没有必要的带外信令.

这很简单,您可以使用众所周知的字符串,枚举或简单的共享对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读