实例分析:例2:使用管道流完成线程之间的通讯。
3575 点击·0 回帖
![]() | ![]() | |
![]() | 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 | |
![]() | ![]() |