首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java从多个线程并发写入单个文本文件?

Java从多个线程并发写入单个文本文件?
EN

Stack Overflow用户
提问于 2015-06-03 14:16:29
回答 3查看 2K关注 0票数 1

我有一个多线程Java7程序(一个jar文件),它使用JDBC执行工作(它使用固定的线程池)。

该程序运行良好,并在从多个并发线程进入命令行界面控制台窗口(System.out.printf())的过程中记录事件。

除了控制台输出之外,我还需要为该程序添加从多个线程写入单个纯ASCII文本日志文件的功能。

输出量低,文件将相对较小,因为它是日志文件,而不是数据文件。

你能推荐一个好的和相对简单的设计/方法来使用Java 7的特性来实现这一点吗(我还没有Java 8)?

任何代码样本也将不胜感激。

非常感谢

编辑:

我忘了补充:在Java7中,使用Files.newOutputStream()静态工厂方法被声明是线程安全的--根据官方Java文档。这是从多个线程写入单个共享文本日志文件的最简单选项吗?

EN

回答 3

Stack Overflow用户

发布于 2015-06-03 14:24:04

如果你想记录输出,为什么不使用一个记录库,比如log4j2?这将允许您根据特定需求定制日志,并且可以在不同步标准输出线程的情况下记录日志(您知道运行System.out.print需要锁定System.out吗?)

编辑:对于后者,如果您记录的内容是线程安全的,并且您可以将LMAX' disruptor.jar添加到您的构建中,您可以配置异步记录器(只需添加" async "),它将有一个日志线程负责整个消息的格式化和写入(并保持日志消息的顺序),同时允许线程顺利运行。

票数 4
EN

Stack Overflow用户

发布于 2015-06-03 14:21:07

考虑到您已经说过输出量很低,最简单的选择可能是编写一个线程安全的写入器,它使用同步来确保一次只有一个线程可以实际写入文件。

如果你不想让线程彼此阻塞,你可以让一个线程专门写,使用一个BlockingQueue -线程将写作业(以它们需要的任何形式--可能只是字符串)添加到队列,然后这个线程从队列中取出值并将它们写到文件中。

无论哪种方式,都值得抽象出专门用于此目的的类背后的细节(出于可测试性和灵活性的原因,理想情况下实现一个接口)。这样,您可以在以后更改实际的底层实现-例如,从同步方法开始,如果需要,稍后再移动到生产者/消费者队列。

票数 2
EN

Stack Overflow用户

发布于 2015-06-03 14:20:49

在要写入的地方保留一个通用的PrintStream引用(而不是System.out),并将其设置为System.out或将其引导到FileOutputStream,这取决于您想要什么。

您的代码不会有太多更改(几乎不会更改),而且PrintStream也已经同步。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30612204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档