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