java - PipedReader/PipedWriter 的更好替代方案?

标签 java data-structures

我需要一个缓冲的 char 流,我在一个线程中写入该流,在另一个线程中从中读取。 Right now我正在使用 PipedReaderPipedWriter对于它,但这些类会导致性能问题: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/

相关文章:

java - 如何从android中的webview获取url中存在的值?

java - 文本编辑器的数据结构在高级语言中位于何处?

java - 显示SVG时无限循环,发现问题,无法解决

java - 检查整数的数字是否在增加(java)

c++ - 逆时针旋转阵列,运行时间问题

c++ - Qt 内置数据结构中是否有忽略项目的重复插入?

c - 我无法使用链表打印多项式

java - 用于在一段时间之前驱逐事件的有效数据结构?

java - 将自定义位置源设置为 Google map 会引发空指针

java - 添加dss字典