Java中通过继承Thread类并配合PipedInputStream/PipedOutputStream实现线程通信,需先调用connect()建立管道连接,写入端向PipedOutputStream写数据并close()通知结束,读取端从PipedInputStream阻塞读取直至返回-1;字符流可用PipedReader/PipedWriter替代,用法类似。

Java中利用继承Thread类配合管道流(PipedInputStream和PipedOutputStream)实现线程通信,核心在于:一个线程作为“写入端”向PipedOutputStream写数据,另一个线程作为“读取端”从关联的PipedInputStream读数据,二者通过connect()建立管道连接。这种方式天然适用于生产者-消费者模型,无需共享变量或外部文件。
必须先建立连接才能通信
管道流不是独立工作的——PipedInputStream和PipedOutputStream必须显式连接,否则写入时会抛出IOException: Pipe not connected。连接只能做一次,且应在启动线程前完成:
- 推荐写法:
outputStream.connect(inputStream) - 也可以在构造
PipedInputStream时传入PipedOutputStream(如new PipedInputStream(out)),效果等价 - 切忌在两个线程中分别构造再尝试连接——容易因时序问题导致
IOException
写入线程继承Thread并操作PipedOutputStream
写入线程通常重写run()方法,将数据写入PipedOutputStream。注意关闭流以通知读端结束,并捕获IOException:
- 使用
out.write(byte[])或out.write(int)发送字节数据 - 写完调用
out.close(),这会触发读端read()返回-1(表示流结束) - 避免在循环中频繁创建新字节数组;可复用缓冲区提升效率
读取线程继承Thread并操作PipedInputStream
读取线程从PipedInputStream中阻塞读取,直到有数据到达或流关闭:
立即学习“Java免费学习笔记(深入)”;
- 用
input.read(byte[])批量读取更高效;单字节读取(input.read())适合简单场景 - 读到
-1说明写端已关闭,应退出循环并调用input.close() - 读取过程自动阻塞——无数据时线程挂起,有数据立即唤醒,无需手动
wait/notify
字符流可用PipedReader/PipedWriter替代
如果传输的是文本数据,直接用字符流更自然,避免手动处理编码:
-
PipedWriter对应写入端,PipedReader对应读取端 - 同样需要
connect(),用法与字节流一致 - 写入用
writer.write(String),读取用reader.read(char[]),自动处理字符编码


















