多线程使用PipedStream 通讯
Java 提供了四个相关的管道流,我们可以使用其在多线程进行数据传递,其分别是
类名 | 作用 | 备注 |
---|---|---|
PipedInputStream | 字节管道输入流 | 字节流 |
PipedOutputStream | 字节管道输出流 | 字节流 |
PipedReader | 字符管道读取 | 字符流 |
PipedWriter | 字符管道写入 | 字符流 |
其分为两类:字节流和字符流,基本步骤为:线程A写入数据到输出流/写入,线程B读取数据从输入流/字符读取,从而实现线程通讯,下面我们先看下基于字节流的实现方法.
写数据到输出流
package com.zhoutao.demo.thread.piped;
import java.io.IOException;
import java.io.PipedOutputStream;
import java.util.concurrent.TimeUnit;
public class WriteData {
private int count = 0;
public void writeMethod(PipedOutputStream pipedOutputStream) throws InterruptedException, IOException {
while (true) {
// 每隔1s向输出流写入数字字符串
pipedOutputStream.write(String.valueOf(count++).getBytes());
TimeUnit.SECONDS.sleep(1);
}
}
}
读数据从输入流
package com.zhoutao.demo.thread.piped;
import java.io.IOException;
import java.io.PipedInputStream;
public class ReadData {
public void readMethod(PipedInputStream inputStream) throws IOException {
byte[] bytes = new byte[20];
int read;
// 当流中不存在数据时候,read方法会进入阻塞状态
while ((read = inputStream.read(bytes)) != -1) {
String newData = new String(bytes, 0, read);
System.out.println("Get Data = " + newData);
}
}
}
启动测试
package com.zhoutao.demo.thread.piped;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipesStreamDemo {
public static void main(String[] args) throws IOException {
// 创建读写对象
WriteData writeData = new WriteData();
ReadData readData = new ReadData();
// 创建管道输入输出流
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
// 重点:连接管道流
pipedOutputStream.connect(pipedInputStream);
// 创建对应的线程并启动
ThreadRead threadRead = new ThreadRead(readData, pipedInputStream);
ThreadWrite threadWrite = new ThreadWrite(writeData, pipedOutputStream);
threadRead.start();
threadWrite.start();
// 观察控制台输出的数据
}
static class ThreadRead extends Thread {
private ReadData readData;
private PipedInputStream inputStream;
public ThreadRead(ReadData readData, PipedInputStream inputStream) {
this.readData = readData;
this.inputStream = inputStream;
}
@Override
public void run() {
try {
readData.readMethod(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}
static class ThreadWrite extends Thread {
private WriteData writeData;
private PipedOutputStream pipedOutputStream;
public ThreadWrite(WriteData writeData, PipedOutputStream pipedOutputStream) {
this.writeData = writeData;
this.pipedOutputStream = pipedOutputStream;
}
@Override
public void run() {
try {
writeData.writeMethod(pipedOutputStream);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试数据
Get Data = 0
Get Data = 1
Get Data = 2
Get Data = 3
Get Data = 4
Get Data = 5
Get Data = 6
Get Data = 7