您的位置:首页 > 其它

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

2012-03-12 11:13 169 查看
1 问题分析

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

2 使用管道流

PipedInputStream和PipedOutputStream

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

PipedInputStream in=new PipedInputStream();

PipedOutputStream out=new PipedOutputStream(in);

3 编写代码

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐