我正在尝试了解管道流。 而不是管道流为什么我们不能使用其他流相互管道?如下所示:
final ByteArrayOutputStream pos = new ByteArrayOutputStream();
final ByteArrayInputStream pis = new ByteArrayInputStream(pos.toByteArray());
我们什么时候会在管道流中遇到死锁?我尝试使用单个主线程进行读写,但它执行顺利。
答案 0 :(得分:0)
这里的难点在于该过程必须在多个线程中实现,因为写入管道的一端必须与另一端的读取匹配。
创建一个线程来监视一个管道末端的到达并将它们推回另一个管道当然不难,但是不能用一个线程来完成。
你看过this问题吗?
答案 1 :(得分:0)
管道流允许高效逐字节处理最小化。
我很可能是错的,但我相信toByteArray()
可能不会做你认为它做的事情。它只是复制当前内容,而不是将来的任何内容。
所以这里唯一真正的问题是对此的管理,这将更加困难。您必须不断轮询输出流。更不用说每次调用toByteArray
(每个调用"Creates a newly allocated byte array")的数组内存分配。
我怀疑在一个帖子中可能发生死锁:
如果您尝试(阻止)从尚未拥有数据的输入流中读取数据。它永远无法获取数据,因为数据只能从必须在同一个线程中写入的输出流中获取,这在您等待数据时不会发生。
所以,在一个线程中,如果你不是很小心就会发生这种情况,但应该可以在没有死锁的同一个线程中成功使用它们,但你为什么要这样做?我认为另一种数据结构可能更适合,比如链表或简单的圆形数组。