管道输入流从一个管道输出流中读取数据。通常由一个线程向管道输出流写数据,由另一个线程从管道输入流中读取数据,两个线程可以用管道来通信。当线程A执行管道输入流的的read()方法时,如果暂时还没有数据,这个线程就会被阻塞,只有当线程B向管道输出流写了新的数据后,线程A才会恢复运行。 下面我们来演示一个例子
Sender类
Receiver类
线程Sender向管道输出流中写字节,线程Receiver 从管道输入流中读取字节。线程Sender输出的字节序列与线程 Receiver读入的字节序列相同。
Sender类
- package xiaohang.com;
- import java.io.PipedOutputStream;
- /** 向管道输出流写数据的线程 */
- class Sender extends Thread {
- private PipedOutputStream out = new PipedOutputStream();
- public PipedOutputStream getPipedOutputStream() {
- return out;
- }
- @Override
- public void run() {
- try {
- for ( int i = - 127 ; i < 128 ; i++) {
- out.write(i);
- // 暂停当前正在执行的线程执行其它线程
- yield();
- }
- // 关闭此管道输出流并释放与此流有关的所有系统资源 此流可能无法再用于写入字节。
- out.close();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
Receiver类
- package xiaohang.com;
- import java.io.IOException;
- import java.io.PipedInputStream;
- /** 从管道输入流读取数据的线程 */
- public class Receiver extends Thread {
- private PipedInputStream in;
- public Receiver(Sender sender) throws IOException {
- // 使此管道输入流连接到管道输出流 PipedOutputStream对象 如果此对象已经连接到其他某个管道输出流,则抛出
- // IOException
- in = new PipedInputStream(sender.getPipedOutputStream());
- }
- @Override
- public void run() {
- try {
- int data;
- while ((data = in.read()) != - 1 )
- System.out.println(data);
- in.close();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- public static void main(String args[]) throws Exception {
- Sender sender = new Sender();
- Receiver receiver = new Receiver(sender);
- sender.start();
- receiver.start();
- }
- }
线程Sender向管道输出流中写字节,线程Receiver 从管道输入流中读取字节。线程Sender输出的字节序列与线程 Receiver读入的字节序列相同。