java线程间通信之通过管道进行通信

时间:2023-03-08 21:19:46

管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西。

jdk中提供了四个类来使线程间可以通信:

1)PipedInputStream和PipedOutputStream

2)PipedReader和PipedWriter

先看看字节流的示例:

 public class ReadData {

     public void readMethod(PipedInputStream in) throws IOException{
System.out.println("begin read...");
byte[] b = new byte[20];
int readLength = in.read(b);
while (readLength != -1) {
String newData = new String(b, 0, readLength);
System.out.println("read:"+newData);
readLength = in.read(b);
}
in.close();
System.out.println("end read...");
} }
 public class WriteData {

     public void writeMethod(PipedOutputStream out) throws IOException{
System.out.println("begin write...");
for (int i = 0; i < 10; i++) {
out.write((""+i).getBytes());
System.out.println("write:"+i);
}
out.close();
System.out.println("end write...");
}
}
 public class ThreadRead extends Thread {

     private ReadData readData;
private PipedInputStream in; public ThreadRead(ReadData readData, PipedInputStream in) {
this.readData = readData;
this.in = in;
} @Override
public void run() {
try {
readData.readMethod(in);
} catch (IOException e) {
e.printStackTrace();
}
}
}
 public class ThreadWrite extends Thread {

     private WriteData writeData;
private PipedOutputStream out; public ThreadWrite(WriteData writeData, PipedOutputStream out) {
this.writeData = writeData;
this.out = out;
} @Override
public void run() {
try {
writeData.writeMethod(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
 public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
WriteData writeData = new WriteData();
ReadData readData = new ReadData(); PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(); in.connect(out); new ThreadWrite(writeData, out).start();
Thread.sleep(2000);
new ThreadRead(readData, in).start();
}
}

java线程间通信之通过管道进行通信

再看看字符流示例:

 public class ReadData {

     public void readMethod(PipedReader reader) throws IOException{
System.out.println("begin read...");
char[] c = new char[20];
int readLength = reader.read(c);
while (readLength != -1) {
String newData = new String(c, 0, readLength);
System.out.println("read:"+newData);
readLength = reader.read(c);
}
reader.close();
System.out.println("end read...");
} }
 public class WriteData {

     public void writeMethod(PipedWriter writer) throws IOException{
System.out.println("begin write...");
for (int i = 0; i < 10; i++) {
writer.write((""+i));
System.out.println("write:"+i);
}
writer.close();
System.out.println("end write...");
}
}
 public class ThreadRead extends Thread {

     private ReadData readData;
private PipedReader reader; public ThreadRead(ReadData readData, PipedReader reader) {
this.readData = readData;
this.reader = reader;
} @Override
public void run() {
try {
readData.readMethod(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
}
 public class ThreadWrite extends Thread {

     private WriteData writeData;
private PipedWriter writer; public ThreadWrite(WriteData writeData, PipedWriter writer) {
this.writeData = writeData;
this.writer = writer;
} @Override
public void run() {
try {
writeData.writeMethod(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
 public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
WriteData writeData = new WriteData();
ReadData readData = new ReadData(); PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader(); writer.connect(reader); new ThreadWrite(writeData, writer).start();
Thread.sleep(2000);
new ThreadRead(readData, reader).start();
}
}

java线程间通信之通过管道进行通信