Java多线程编程笔记6:通过管道进行线程间通信

413 阅读1分钟

Java中提供了很多Stream来对数据进行操作。PipeStream是一种特殊的流,用于在不同的线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助类似临时文件之类的东西。

JDK中提供了四个类:PipedInputStream,PipedOutputStream;PipedReader,PipedWriter。

示例代码如下:

public class ReadData {
    public void read(PipedInputStream in) {
        try {
            System.out.println("read : ");
            byte[] bytes = new byte[20];
            int readLen = in.read(bytes);
            while (readLen != -1) {
                String newData=new String(bytes,0,readLen);
                System.out.println(newData);
                readLen=in.read(bytes);
            }
            System.out.println();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class WriteData {
    public void write(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();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class WriteThread extends Thread{
    private WriteData write;
    private PipedOutputStream out;
    public WriteThread(WriteData write,PipedOutputStream out){
        this.write=write;
        this.out=out;
    }

    @Override
    public void run() {
        write.write(out);
    }
}

class ReadThread extends Thread{
    private ReadData read;
    private PipedInputStream in;
    public ReadThread(ReadData read,PipedInputStream in){
        this.read=read;
        this.in=in;
    }

    @Override
    public void run() {
        read.read(in);
    }
}

public class Run {
    public static void main(String[] args) {
        try {
            WriteData writeData=new WriteData();
            ReadData readData=new ReadData();

            PipedInputStream in=new PipedInputStream();
            PipedOutputStream out=new PipedOutputStream();

            out.connect(in);

            ReadThread readThread=new ReadThread(readData,in);
            readThread.start();
            Thread.sleep(2000);
            WriteThread writeThread=new WriteThread(writeData,out);
            writeThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出结果:

read : 
write : 

12345678910111213141
51617181920212223242
52627282930313233343
53637383940414243444
54647484950515253545
55657585960616263646
...