使用 PipedInputStream java 写入结束死异常
Posted
技术标签:
【中文标题】使用 PipedInputStream java 写入结束死异常【英文标题】:Write end dead exception using PipedInputStream java 【发布时间】:2011-07-24 03:16:25 【问题描述】:写结束死异常发生在以下情况: 两个线程:
A: PipedOutputStream put = new PipedOutputStream();
String msg = "MESSAGE";
output.wirte(msg.getBytes());
output.flush();
B: PipedInputStream get = new PipedOutputStream(A.put);
byte[] get_msg = new byte[1024];
get.read(get_msg);
情况如下:A和B同时运行,A写入管道,B读取。 B 刚刚从管道中读取,该管道的缓冲区被清除。然后 A 不会以未知的间隔将 msg 写入管道。但是,在某一时刻,B 再次读取管道并出现java.io.IOException: write end dead
,因为管道的缓冲区仍然是空的。而且我不想 sleep() 线程 B 等待 A 写入管道,这也是不稳定的。如何避免和解决这个问题?谢谢
【问题讨论】:
techtavern.wordpress.com/2008/07/16/… 嘿,如果您仍然在 SO,请接受其中一个答案。他们解决了我的问题,他们值得被赞成 + 接受,这将增加他们对未来读者的知名度 【参考方案1】:您需要在写入线程完成之前关闭 PipedOutputStream(当然在写入所有数据之后)。 PipedInputStream 在没有写入线程且 writer 未正确关闭时在 read() 上抛出此异常
【讨论】:
【参考方案2】:当你有以下情况时会出现“Write end dead”异常:
一个 PipedInputStream 连接到一个 PipedOutputStream 和 这些管道的末端由两个不同的线程读取/写入 螺纹完成时不会关闭管道的一侧。要解决此异常,只需在完成向管道流写入和读取字节后,在线程的可运行文件中关闭管道流即可。
这里是一些示例代码:
final PipedOutputStream output = new PipedOutputStream();
final PipedInputStream input = new PipedInputStream(output);
Thread thread1 = new Thread(new Runnable()
@Override
public void run()
try
output.write("Hello Piped Streams!! Used for Inter Thread Communication".getBytes());
output.close();
catch(IOException io)
io.printStackTrace();
);
Thread thread2 = new Thread(new Runnable()
@Override
public void run()
try
int data;
while((data = input.read()) != -1)
System.out.println(data + " ===> " + (char)data);
input.close();
catch(IOException io)
io.printStackTrace();
);
thread1.start();
thread2.start();
完整代码在这里:https://github.com/prabhash1785/Java/blob/master/JavaCodeSnippets/src/com/prabhash/java/io/PipedStreams.java
更多详情,请看这个不错的博客:https://techtavern.wordpress.com/2008/07/16/whats-this-ioexception-write-end-dead/
【讨论】:
以上是关于使用 PipedInputStream java 写入结束死异常的主要内容,如果未能解决你的问题,请参考以下文章
java 如何使用PipedInputStream和PipedOutputStream
使用 PipedInputStream java 写入结束死异常
Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter