转载:http://ifeve.com/java-io-%e7%ae%a1%e9%81%93/
Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力。所以管道也可以作为数据源以及目标媒介。
你不能利用管道与不同的JVM中的线程通信(不同的进程)。在概念上,Java的管道不同于Unix/Linux系统中的管道。
可以通过Java IO中的PipedOutputStream和PipedInputStream创建管道。一个PipedInputStream流应该和一个PipedOutputStream流相关联。一个线程通过PipedOutputStream写入的数据可以被另一个线程通过相关联的PipedInputStream读取出来。
package test.io.io;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* 测试Java io 创建管道
* 同一个jvm 的同一个进程的多个线程可以通过io管道相关联,
* 当使用两个相关联的管道流时,务必将它们分配给不同的线程。read()方法和write()方法调用时会导致流阻塞,这意味着如果你尝试在一个线程中同时进行读和写,可能会导致线程死锁。
* 用两个管道共有的connect()方法使之相关联。PipedInputStream和PipedOutputStream都拥有一个可以互相关联的connect()方法。
* 参考:http://ifeve.com/java-io-%e7%ae%a1%e9%81%93/
* @author 12198
*
*/
public class PipeExample {
public static void main(String[] args) throws IOException {
final PipedOutputStream out = new PipedOutputStream();
final PipedInputStream input = new PipedInputStream(out);//使他们相关联
input.connect(out);//connect 相关联
Thread thread = new Thread(new Runnable() {
public void run() {
try {
out.write("Hello Piper".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread.start();
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
int a =input.read();
while(a != -1) {
System.out.println((char)a);
a = input.read();
}
out.flush();
input.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread2.start();
}
}