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总结
- Java中管道作用于一个Jvm,操作系统管道作用于进程之间。
- 管道输出流是发送消息,输入流是接收消息。