简介
在java提供的各种流中,有一种管道流是一种很特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管到中读数据。在JDK中提供4个类来实现线程间通信。
(1)字节流:PipedOutputStream和PipedInputStream
(2)字符流:PipedReader和PipedWriter
字节流实现
public class ReadData {
public void readMethod(PipedInputStream input){
try {
System.out.println("read :");
byte []byteArray=new byte[20];
int len=0;
while((len=input.read(byteArray))!=-1){
String newData=new String(byteArray,0,len);
System.out.println(newData);
}
System.out.println();
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//写类
public class WriteData {
public void writeMethod(PipedOutputStream out){
try {
System.out.println("write");
for(int i=0;i<300;i++){
String outData=""+(i+1);
out.write(outData.getBytes());
System.out.println(outData);
}
System.out.println();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//线程类
public class ThreadWrite extends Thread{
private WriteData writeData;
private PipedOutputStream out;
public ThreadWrite(com.thtx.fsl.chapter03.WriteData writeData,
PipedOutputStream out) {
super();
this.writeData = writeData;
this.out = out;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
writeData.writeMethod(out);
}
}
public class ThreadRead extends Thread{
private ReadData readData;
private PipedInputStream input;
public ThreadRead(ReadData readData,
PipedInputStream input) {
super();
this.readData = readData;
this.input = input;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
readData.readMethod(input);
}
}
public class Run {
public static void main(String[] args) {
try {
WriteData writeData=new WriteData();
ReadData readData=new ReadData();
PipedInputStream input=new PipedInputStream();
PipedOutputStream out=new PipedOutputStream();
//out.connect(input);
input.connect(out);
ThreadRead read=new ThreadRead(readData, input);
read.start();
ThreadWrite write=new ThreadWrite(writeData, out);
write.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:可以看到,读的时候由于没有数据,则先写,写完后才开始读。
字符流
和字节流操作方式一样。
案例:
public class ReadData {
public void readMethod(PipedInputStream input){
try {
System.out.println("read :");
byte []byteArray=new byte[20];
int len=0;
while((len=input.read(byteArray))!=-1){
String newData=new String(byteArray,0,len);
System.out.println(newData);
}
System.out.println();
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class ReadData {
public void readMethod(PipedReader input){
try {
System.out.println("read :");
char []byteArray=new char[20];
int len=0;
while((len=input.read(byteArray))!=-1){
String newData=new String(byteArray,0,len);
System.out.println(newData);
}
System.out.println();
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//线程
public class ThreadRead extends Thread{
private ReadData readData;
private PipedReader input;
public ThreadRead(ReadData readData,
PipedReader input) {
super();
this.readData = readData;
this.input = input;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
readData.readMethod(input);
}
}
public class ThreadWrite extends Thread{
private WriteData writeData;
private PipedWriter out;
public ThreadWrite(WriteData writeData,
PipedWriter out) {
super();
this.writeData = writeData;
this.out = out;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
writeData.writeMethod(out);
}
}
public static void main(String[] args) {
try {
WriteData writeData=new WriteData();
ReadData readData=new ReadData();
PipedReader input=new PipedReader();
PipedWriter out=new PipedWriter();
//out.connect(input);
input.connect(out);
ThreadRead read=new ThreadRead(readData, input);
read.start();
ThreadWrite write=new ThreadWrite(writeData, out);
write.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:和上面基本一样