用一个编写器线程(Java)替换写入outputstream的多个线程

用一个编写器线程(Java)替换写入outputstream的多个线程,java,multithreading,Java,Multithreading,我有一个现有的应用程序,其中多个线程通过outputstream进行写入(并在其上进行同步)。我想知道切换到单编写器原则来编写outputstream是否会更有效率(我这样做只是出于学术原因,因为我不相信这会对应用程序性能造成太大影响,尽管我可能是错的)。目前,我只考虑对所有当前写入程序使用blockingqueue或环形缓冲区进行写入,并使用一个写入程序线程(队列/环形缓冲区的使用者)写入输出流/通道。 任何关于这方面的想法或有用的建议都是非常受欢迎的 如果系统上有足够的空闲容量(空闲CPU时

我有一个现有的应用程序,其中多个线程通过outputstream进行写入(并在其上进行同步)。我想知道切换到单编写器原则来编写outputstream是否会更有效率(我这样做只是出于学术原因,因为我不相信这会对应用程序性能造成太大影响,尽管我可能是错的)。目前,我只考虑对所有当前写入程序使用blockingqueue或环形缓冲区进行写入,并使用一个写入程序线程(队列/环形缓冲区的使用者)写入输出流/通道。

任何关于这方面的想法或有用的建议都是非常受欢迎的

如果系统上有足够的空闲容量(空闲CPU时间、可用IO时间),那么添加一个单独的线程来只记录IO将显著提高整个系统的性能

java.util.concurrent
包中添加一个队列,其中包含一组添加到队列中的线程,以及一个从队列读取并写出输出的日志线程,这将是一个很好的解决方案

另一方面,如果您有一个充分利用的系统,那么队列将变得太大,或者开销将变得明显,日志线程的好处将变得微不足道


在大多数情况下,我看到一个单独的日志线程是有益的。

您的问题是什么?很难说。如果你说的是写入单个文件,那么每次写入都必须涉及三个操作——打开、追加、刷新和关闭。越来越多的线程竞相这样做,这将开始影响性能。我处理这些情况的方法是使用(多个)生产者->单一消费者方法-使用数据/消息队列或类似方法。根据队列实现,您可能根本不需要任何同步,从而消除任何等待和死机-locks@Germann-这就是我的想法exploring@Germann-输出到套接字客户端。可能是我不明白:为什么需要/想要对套接字输出进行同步?每个线程不是一个单独的套接字吗?在这种情况下,同步是不相关的。谢谢-这就是我正在研究的想法。我在考虑将其与具有多个生产者的中断器模式混合使用-如果这不起作用,我将切换到arrayblockingqueue/linkedblockingqueue.fyi它不是记录输出,而是实际写入套接字客户端。