gpt4 book ai didi

java - 使用 PipedInputStream java 写入结束死异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:31 24 4
gpt4 key购买 nike

Write end dead exception在以下情况发生:两个线程:

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 写入管道,这也是不稳定的。如何避免和解决这个问题?谢谢

最佳答案

当您有以下情况时,将出现“Write end dead”异常:

  • 连接到 PipedOutputStream 的 PipedInputStream 和
  • 这些管道的末端由两个不同的线程读/写
  • 线程完成时不会关闭管道的一侧。

要解决此异常,只需在完成向管道流写入字节和从管道流读取字节后,在线程的可运行对象中关闭管道流即可。

下面是一些示例代码:

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/

关于java - 使用 PipedInputStream java 写入结束死异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com