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