java可以通过多个线程提高程序的执行性能,所以在进行I/O设计时也提供了不同线程间的管道流通信流。
管道流的主要作用是可以进行两个线程间的通信,分为管道输出流(PIpedOutputStream、PipedWriter)、管道输入流(PipedInputStream、PipedReader)。如果要想进行管道输出,则必须把输出流连在输入流之上。在管道输出流类上定义有以下两个连接方法:
- 【PipedOutputStream】管道连接:public void connect(PipedInputStream snk){}
- 【PipedWriter】管道连接:public void connect(PipedInputStream snk){}
1、使用字节管道流实现线程通信的例子:
package com.mydemo;
import java.io.*;
public class FileIODemo {
public static void main(String[] args) throws Exception {
// 实例化发送线程
SendThread sendThread = new SendThread();
// 实例化接收线程
ReceiveThread receiveThread = new ReceiveThread();
// 管道连接
sendThread.getPipedOutputStream().connect(receiveThread.getPipedInputStream());
// 启动线程
new Thread(sendThread, "消息发送线程").start();
new Thread(receiveThread, "消息接收线程").start();
}
}
// 管道发送线程
class SendThread implements Runnable {
// 管道输出流
private PipedOutputStream pipedOutputStream;
/**
* 无参构造
*/
public SendThread() {
// 实例化管道输出流
this.pipedOutputStream = new PipedOutputStream();
}
@Override
public void run() {
try {
// 数据发送
this.pipedOutputStream.write("这是“管道发送线程”发送的信息\n".getBytes());
// 关闭输出流
this.pipedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public PipedOutputStream getPipedOutputStream() {
return pipedOutputStream;
}
public void setPipedOutputStream(PipedOutputStream pipedOutputStream) {
this.pipedOutputStream = pipedOutputStream;
}
}
// 数据接收线程
class ReceiveThread implements Runnable {
// 管道输入流【读取流】
private PipedInputStream pipedInputStream;
/**
* 无参构造方法
*/
public ReceiveThread() {
this.pipedInputStream = new PipedInputStream();
}
@Override
public void run() {
// 开启读取缓冲区
byte data[] = new byte[1024];
// 读取长度
int len = 0;
// 通过内存流保存内容
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
// 部分数据读取
while ((len = this.pipedInputStream.read(data)) != -1) {
// 数据保存到内存流
byteArrayOutputStream.write(data, 0, len);
}
// 输出数据
System.out.println(new String(byteArrayOutputStream.toByteArray()));
// 关闭内存流
byteArrayOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
// 关闭输入流
this.pipedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public PipedInputStream getPipedInputStream() {
return pipedInputStream;
}
public void setPipedInputStream(PipedInputStream pipedInputStream) {
this.pipedInputStream = pipedInputStream;
}
}
运行结果:
这是“管道发送线程”发送的信息