2013-04-17 79 views
0

我想了解管道流。 而不是管道流为什么我们不能使用其他流来互相管道?如下所示:无法理解管道输入流

final ByteArrayOutputStream pos = new ByteArrayOutputStream(); 

final ByteArrayInputStream pis = new ByteArrayInputStream(pos.toByteArray()); 

什么时候会在管道流中出现死锁?我试图使用单个主线程读写,但它执行顺利。

+0

对此有任何答案? – user2286271

回答

0

这里的难点在于该进程必须在多个线程中实现,因为写入管道的一端必须与另一端的读取匹配。

创建一个线程来监视一个管道末端的到达并将它们推回另一个管道当然并不困难,但它不能用单个线程完成。

你看过this的问题吗?

0

管道流允许高效使用最小努力的字节处理

我很可能是错的,但我相信toByteArray()可能不会做你认为它的做法。它只是复制当前的内容,而不是将来的任何内容。

所以这里唯一真正的问题就是管理这个问题,这会有点困难。你必须不断地轮询输出流。更不用说每次调用toByteArray(其中每个调用都使用"Creates a newly allocated byte array")的数组内存分配。

如何我怀疑死锁可以在一个单独的线程发生:

如果您尝试(阻塞)从没有数据尚未输入流中读取。它永远无法获取数据,因为数据只能从必须写入同一线程的输出流中获取,而这在您等待数据时不会发生。

所以,在单线程中,如果你不是很小心,会发生这种情况,但应该有可能在同一个线程中成功使用它们而没有死锁,但为什么要这么做呢?我认为另一个数据结构可能更适合,如链接列表或简单的圆形数组。