4.3 Pipe

       Java 管道Pipe是用于线程间通信的,但是需要注意的是,Java中的Pipe是用于一个虚拟机中的线程之间通信的,不能用于进程之间通信。 Java管道和Unix/Linux中的管道Pipe的作用是不同的,Unix/Linux中的管道是用于进程之间通讯,是不同Process之间。而Java是同一个虚拟机里的线程之间通讯,属于同一个Program。

       Java中Pipe分为了两个类型,字符流和字节流。二者又分为输入流和输出流,输出流是发送消息,输入流是接收消息。



字节流输出

字节输入

字符输出

字符输入

PipedOutputStream

PipedInputStream

PipedWriter

PipedReader


4.3.1 Java 字节流Pipe管道用法

       创建输出流管道。

final PipedOutputStream output = new PipedOutputStream();

       创建输入流管道,构造参数为输出流实列。

final PipedOutputStream output = new PipedOutputStream();
final PipedInputStream  input  = new PipedInputStream(output);

Thread thread1 = new Thread(()-> {
        try {
            output.write("Hello world, pipe!".getBytes());
            System.err.println(Thread.currentThread().getName()+"已输出!");
        } catch (IOException ignored) {
        }
});


Thread thread2 = new Thread(()-> {
        try {
            int data = input.read();
            System.err.println(Thread.currentThread().getName());
            while(data != -1){
                System.out.print((char) data);
                data = input.read();
            }
        } catch (IOException e) {
        }
});

thread1.start();
thread2.start();


4.3.2 Java 字符流Pipe管道用法

       创建字符流输出流管道。

PipedWriter pipedWriter = new PipedWriter();

       创建字符流输入流管道。

PipedReader pipedReader = new PipedReader(pipedWriter);

       完整实例。

PipedWriter pipedWriter = new PipedWriter();
PipedReader pipedReader = new PipedReader(pipedWriter);

new Thread(()->{
    try {
        pipedWriter.write("pipedWriter write msg!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();


new Thread(()->{
    char[] str = new char[1024];
    try {
        pipedReader.read(str);
        System.err.println(new String(str));
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

4.3.3 Pipe总结

  1. Java中管道作用于一个Jvm,操作系统管道作用于进程之间。
  2. 管道输出流是发送消息,输入流是接收消息。