我有一个多线程Java7程序(一个jar文件),它使用JDBC执行工作(它使用固定的线程池)。
该程序运行良好,并在从多个并发线程进入命令行界面控制台窗口(System.out.printf())的过程中记录事件。
除了控制台输出之外,我还需要为该程序添加从多个线程写入单个纯ASCII文本日志文件的功能。
输出量低,文件将相对较小,因为它是日志文件,而不是数据文件。
你能推荐一个好的和相对简单的设计/方法来使用Java 7的特性来实现这一点吗(我还没有Java 8)?
任何代码样本也将不胜感激。
非常感谢
编辑:
我忘了补充:在Java7中,使用Files.newOutputStream()静态工厂方法被声明是线程安全的--根据官方Java文档。这是从多个线程写入单个共享文本日志文件的最简单选项吗?
发布于 2015-06-03 14:24:04
如果你想记录输出,为什么不使用一个记录库,比如log4j2?这将允许您根据特定需求定制日志,并且可以在不同步标准输出线程的情况下记录日志(您知道运行System.out.print需要锁定System.out吗?)
编辑:对于后者,如果您记录的内容是线程安全的,并且您可以将LMAX' disruptor.jar添加到您的构建中,您可以配置异步记录器(只需添加" async "),它将有一个日志线程负责整个消息的格式化和写入(并保持日志消息的顺序),同时允许线程顺利运行。
发布于 2015-06-03 14:21:07
考虑到您已经说过输出量很低,最简单的选择可能是编写一个线程安全的写入器,它使用同步来确保一次只有一个线程可以实际写入文件。
如果你不想让线程彼此阻塞,你可以让一个线程专门写,使用一个BlockingQueue
-线程将写作业(以它们需要的任何形式--可能只是字符串)添加到队列,然后这个线程从队列中取出值并将它们写到文件中。
无论哪种方式,都值得抽象出专门用于此目的的类背后的细节(出于可测试性和灵活性的原因,理想情况下实现一个接口)。这样,您可以在以后更改实际的底层实现-例如,从同步方法开始,如果需要,稍后再移动到生产者/消费者队列。
发布于 2015-06-03 14:20:49
在要写入的地方保留一个通用的PrintStream
引用(而不是System.out
),并将其设置为System.out
或将其引导到FileOutputStream
,这取决于您想要什么。
您的代码不会有太多更改(几乎不会更改),而且PrintStream
也已经同步。
https://stackoverflow.com/questions/30612204
复制相似问题