说明
java语言中提供了各种输入/输出流,使得我们能够方便的操作数据,其中管道流(PipeStream)是一种特殊的流,可以用于不同线程间直接传送数据。
一个线程发送数据到输出管道,另外一个线程从输出管道中读取数据,通过使用管道,可以实现不同线程间的通信,无须借助文件之类的存储介质。
在JDK中提供了几个管道流类可以使线程间进行通信:
1、PipedInputStream和PipedOutputStream
2、PipedReader和PipedWriter
分别是字节流和字符流
以字节流PipedInputStream和PipedOutputStream为例
1、实现读/写类
import java.io.IOException;
import java.io.PipedInputStream;
public class ReadData {
public void readMethod(PipedInputStream input) throws IOException {
try {
System.out.println("read:");
byte[] array = new byte[1024];
int readLength = input.read(array);
while (readLength != -1) {
String data = new String(array, 0, readLength);
System.out.print(data);
readLength = input.read(array);
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
} finally {
input.close();
}
}
}
import java.io.IOException;
import java.io.PipedOutputStream;
public class WriteData {
public void writeMethod(PipedOutputStream out) throws IOException {
try {
System.out.println("write:");
for (int i = 0; i < 100; i++) {
String data = (i + 1) + "";
out.write(data.getBytes());
System.out.print(data);
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}
}
2、实现多线程
import java.io.PipedInputStream;
public class ThreadRead extends Thread {
private ReadData read;
private PipedInputStream input;
public ThreadRead(ReadData read, PipedInputStream input) {
this.read = read;
this.input = input;
}
public void run() {
try {
read.readMethod(input);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.PipedOutputStream;
public class ThreadWrite extends Thread {
private WriteData write;
private PipedOutputStream output;
public ThreadWrite(WriteData write, PipedOutputStream output) {
this.write = write;
this.output = output;
}
public void run() {
try {
write.writeMethod(output);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、运行线程测试
public class Client {
public static void main(String[] args) {
try {
WriteData write = new WriteData();
ReadData read = new ReadData();
PipedInputStream inputStream = new PipedInputStream();
PipedOutputStream outStream = new PipedOutputStream();
outStream.connect(inputStream);
ThreadRead threadR = new ThreadRead(read, inputStream);
ThreadWrite threadW = new ThreadWrite(write, outStream);
threadR.start();
threadW.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码通过管道流,将多线程进行通信,运行输出相应数据: