Java多线程编程3--通过管道线程间通信(字节流、字符流)

来源:互联网 发布:颖儿长相知乎 编辑:程序博客网 时间:2024/06/06 06:38

    在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使用代码inputStream.connect(outputStream)或outputStream.connect(inputStream)的作用使两个 Stream之间产生通信链接,这样才可以进行输出输入。

0 0