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

2014-11-24 07:28:32 · 作者: · 浏览: 7

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