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

问题分析

本题中需要一个线程向管道写入数据,另外一个线程从管道中读出数据,需要使用到与管道有关的流PipedInputStreamPipedOutputStream

使用管道流

PipedInputStreamPipedOutputStream

管道流用来在线程间进行通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须有一个输入方和一个输出方。

PipedInputStream  in=new PipedInputStream();

PipedOutputStream out=new PipedOutputStream(in);

编写代码

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值