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的管道是可能的。