灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3246回复:0

实例分析:例2:使用管道流完成线程之间的通讯。

楼主#
更多 发布于:2012-09-08 09:36


1 问题分析
本题中需要一个线程向管道写入数据,另外一个线程从管道中读出数据,需要使用到与管道有关的流PipedInputStream和PipedOutputStream。
2 使用管道流
PipedInputStream和PipedOutputStream
管道流用来在线程间进行通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须有一个输入方和一个输出方。
PipedInputStream  in=new PipedInputStream();
PipedOutputStream out=new PipedOutputStream(in);
3 编写代码
[java]
import java.io.*;

public class TestPipeStream {
    public static void main(String[] args) {
        try {
            PipedInputStream in1 = new PipedInputStream();
            PipedOutputStream out1 = new PipedOutputStream(in1);

            PipedInputStream in2 = new PipedInputStream();
            PipedOutputStream out2 = new PipedOutputStream(in2);

            ThreadC tc = new ThreadC(out1);
            ThreadZ tz = new ThreadZ(out2, in1);
            ThreadQ tq = new ThreadQ(in2);
            tc.start();
            tz.start();
            tq.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static class ThreadC extends Thread {
        DataOutputStream DOS = null;

        public ThreadC(OutputStream os) {
            DOS = new DataOutputStream(os);
        }

        public void run() {
            while (true) {
                try {
                    double d = Math.random();
                    DOS.writeDouble(d);
                    sleep(2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };

    static class ThreadZ extends Thread {
        DataOutputStream DOS = null;

        DataInputStream dis = null;

        public ThreadZ(OutputStream os, InputStream is) {
            DOS = new DataOutputStream(os);
            dis = new DataInputStream(is);
        }

        public void run() {
            while (true) {
                try {
                    double d = dis.readDouble();
                    DOS.writeDouble(d);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };

    static class ThreadQ extends Thread {
        DataInputStream dis = null;

        public ThreadQ(InputStream is) {
            dis = new DataInputStream(is);
        }

        public void run() {
            while (true) {
                try {
                    double d = dis.readDouble();
                    System.out.println(d);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };
}
import java.io.*;
public class TestPipeStream {
public static void main(String[] args) {
  try {
   PipedInputStream in1 = new PipedInputStream();
   PipedOutputStream out1 = new PipedOutputStream(in1);
   PipedInputStream in2 = new PipedInputStream();
   PipedOutputStream out2 = new PipedOutputStream(in2);
   ThreadC tc = new ThreadC(out1);
   ThreadZ tz = new ThreadZ(out2, in1);
   ThreadQ tq = new ThreadQ(in2);
   tc.start();
   tz.start();
   tq.start();
  } catch (Exception e) {
   e.printStackTrace();
  }
}
static class ThreadC extends Thread {
  DataOutputStream DOS = null;
  public ThreadC(OutputStream os) {
   DOS = new DataOutputStream(os);
  }
  public void run() {
   while (true) {
    try {
     double d = Math.random();
     DOS.writeDouble(d);
     sleep(2);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
};
static class ThreadZ extends Thread {
  DataOutputStream DOS = null;
  DataInputStream dis = null;
  public ThreadZ(OutputStream os, InputStream is) {
   DOS = new DataOutputStream(os);
   dis = new DataInputStream(is);
  }
  public void run() {
   while (true) {
    try {
     double d = dis.readDouble();
     DOS.writeDouble(d);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
};
static class ThreadQ extends Thread {
  DataInputStream dis = null;
  public ThreadQ(InputStream is) {
   dis = new DataInputStream(is);
  }
  public void run() {
   while (true) {
    try {
     double d = dis.readDouble();
     System.out.println(d);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
};
}
编译运行
javac TestPipeStream.java
java TestPipeStream


喜欢0 评分0
游客

返回顶部