在Java语言中提供了各种各样的输人/输出流Stream,使我们能够很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输人管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。
在Java的JDK中提供了4个类来使线程间可以进行通信:
1)PipedInputStream和PipedOutputStream
2)PipedReader和PipedWriter
1、通过管道进行线程间通信:字节流/字符流
public class WriteData { public void writeMethod(PipedOutputStream out) { //字符流这里换成PipeWriter try { System.out.println("write :"); for (int i=0; i<10; i++) { String outData = "" + (i+1); out.write(outData.getBytes()); //字符流这里换成out.write(outData) System.out.print(outData); } System.out.println(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }
public class ReadData { public void readMethod(PipedInputStream input) { //字符流这里换成PipedReader try { System.out.println("read: "); byte[] byteArray = new byte[20]; //字符流这里换成char int readLength = input.read(byteArray); while (readLength != -1) { String newData = new String(byteArray, 0, readLength); System.out.println(newData); readLength = input.read(byteArray); } System.out.println(); input.close(); } catch (IOException e) { e.printStackTrace(); } } }两个自定义线程
public class ThreadWrite extends Thread { private WriteData write; private PipedOutputStream out; //字符流这里换成PipedWriter public ThreadWrite(WriteData write, PipedOutputStream out) { //字符流这里换成PipedWriter this.write = write; this.out = out; } public void run() { write.writeMethod(out); } }
public class ThreadRead extends Thread { private ReadData read; private PipedInputStream input; //字符流这里换成PipedRead public ThreadRead(ReadData read, PipedInputStream input) { //字符流这里换成PipedRead this.read = read; this.input = input; } public void run() { read.readMethod(input); } }
public class Run { public static void main(String[] args) throws InterruptedException, IOException { WriteData writeData = new WriteData(); ReadData readData = new ReadData(); PipedInputStream inputStream = new PipedInputStream(); //字符流用PipedReader PipedOutputStream outputStream = new PipedOutputStream(); //字符流用PipedWriter inputStream.connect(outputStream); //这两个只能用一个 //outputStream.connect(inputStream); ThreadRead threadRead = new ThreadRead(readData,inputStream); threadRead.start(); Thread.sleep(2000); ThreadWrite threadWrite = new ThreadWrite(writeData,outputStream); threadWrite.start(); } }
read: write : 12345678910 12345678910 |