Java IO: Pipes

Java IO: Pipes

在同一个JVM中我们可以使用Pipes使得两个线程通信。

使用Java IO创建管道是通过PipedOutputStream和PipedInputStream类完成的。 PipedInputStream应连接到PipedOutputStream。 由一个线程写入PipedOutputStream的数据可以由另一个线程从连接的PipedInputStream读取。

demo

package com.viashare.pipe;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * Created by Jeffy on 16/03/15.
 */
public class PipeMain {

    public static void main(String[] args) throws IOException {
        final PipedOutputStream pipedOutputStream = new PipedOutputStream();
        final PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);

        new Thread(()->{
            try {
                pipedOutputStream.write("hello piped input stream".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(()->{
            try {
                int data = pipedInputStream.read();
                while (data !=-1){
                    System.err.println((char) data);
                    data = pipedInputStream.read();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }

}

您还可以使用connect()方法连接两个管道流。 PipedInputStream和PipedOutputStream都有一个connect()方法,可以将一个连接到另一个。

当使用两个连接的管道流时,将一个流传递给一个线程,将另一个流传递到另一个线程。 流上的read()和write()调用是阻塞的,这意味着如果您尝试使用相同的线程进行读取和写入,则可能会导致线程本身死锁。

线程可以在同一个JVM内进行通信的管道有很多。 事实上,线程更经常交换完整对象而不是原始字节数据。 但是 - 如果您需要在线程之间交换原始字节数据,Java IO的管道是可能的。

你可能感兴趣的:(Java IO: Pipes)