Java IO:管道

时间:2020-01-09 10:36:05  来源:igfitidea点击:

Java IO中的管道使运行在同一JVM中的两个线程能够进行通信。因此,管道也可以是数据的源或者目的地。

我们不能使用管道与其他JVM(不同的进程)中的线程进行通信。 Java中的管道概念不同于Unix / Linux中的管道概念,在Unix / Linux中,运行在不同地址空间中的两个进程可以通过管道进行通信。在Java中,通信方必须在同一进程中运行,并且应该是不同的线程。

通过Java IO创建管道

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

Java IO管道示例

这是一个简单的示例,说明如何将" PipedInputStream"连接到" PipedOutputStream":

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

public class PipeExample {

    public static void main(String[] args) throws IOException {

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

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    output.write("Hello world, pipe!".getBytes());
                } catch (IOException e) {
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int data = input.read();
                    while(data != -1){
                        System.out.print((char) data);
                        data = input.read();
                    }
                } catch (IOException e) {
                }
            }
        });

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

    }
}

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

管道和螺纹

记住,当使用两个连接的管道流时,将一个流传递给一个线程,将另一个流传递给另一个线程。流上的read()write()调用被阻塞,这意味着如果我们尝试使用同一线程进行读写,则可能导致线程自身死锁。

管道替代

除了管道外,还有许多其他方法可以使线程在同一JVM中进行通信。实际上,线程更经常交换完整的对象,而不是原始字节数据。但是,如果我们需要在线程之间交换原始字节数据,则可以使用Java IO的管道。