当前位置:编程学习 > JAVA >>

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

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();
 &n

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,