我需要一个缓冲的 char
流,我在一个线程中写入该流,在另一个线程中从中读取。 Right now我正在使用 PipedReader和 PipedWriter对于它,但这些类会导致性能问题:PipedReader 在其内部缓冲区为空时执行 wait(1000)
,这会导致我的应用程序明显滞后。
是否有一些库可以做与 PipedReader/PipedWriter 相同的事情,但性能更好?还是我必须实现自己的轮子?
最佳答案
问题在于,当向 PipedWriter 写入内容时,它不会自动通知 PipedReader 有一些数据要读取。当尝试读取 PipedReader 而缓冲区为空时,PipedReader 将循环并使用 wait(1000)
调用等待,直到缓冲区有一些数据。
解决方案是在向管道写入内容后始终调用 PipedWriter.flush()
。 flush 所做的只是在读取器上调用 notifyAll()
。问题代码的修复 looks like this .
(对我来说,PipedReader/PipedWriter 实现看起来非常像一个过早优化的案例——为什么不在每次写入时都通知所有?此外,读取器在一个 Activity 循环中等待,每秒醒来,而不是仅在有一些值得阅读的东西。该代码还包含一些待办事项注释,它所做的读取器/写入器线程检测不够复杂。)
同样的问题似乎也在 PipedOutputStream 中.在我当前的项目中,手动调用 flush()
是不可能的(无法修改 Commons IO 的 IOUtils.copy() ),所以我通过创建 low-latency wrappers 来修复它对于管道类。他们比原来的类(class)工作得更好。 :-)
关于java - PipedReader/PipedWriter 的更好替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2843555/