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.
javajava TestPipeStream