/*
* 本程序演示了利用PipedWriter和PipedReader实现两个线程通讯的例子。
*/
package com.lwj.demo;
import java.io.*;
class Sender implements Runnable {
private PipedWriter out;
public Sender() {
out = new PipedWriter();
}
public PipedWriter getOut() {
return out;
}
public void run() {
for (char ch = 'a'; ch <= 'z'; ch++) {
try {
out.write(ch);
System.out.println(Thread.currentThread().getName()+":已发送"+ch);
Thread.sleep(50);//为了好观察
} catch (Exception e) {
e.printStackTrace();
}
}
try{
out.close();//记得关闭哟!
}catch(Exception e){
e.printStackTrace();
}
}
}
class Receiver implements Runnable {
PipedReader in;
public Receiver(Sender sender) {
try {
in = new PipedReader(sender.getOut());
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
int i;
try {
while ((i=in.read())!=-1) {
Thread.sleep(50);//为了好观察
System.out.println(Thread.currentThread().getName()+":接收"+(char)i+"完毕!");
}
} catch (Exception e) {
e.printStackTrace();
}
try{
in.close();//记得关闭哟!
}catch(Exception e){
e.printStackTrace();
}
}
}
public class PipedIO {
public static void main(String[] args) {
Sender sender = new Sender();
Receiver receiver = new Receiver(sender);
Thread senderThread = new Thread(sender,"发送者线程");
Thread receiverThread = new Thread(receiver,"接收者线程");
senderThread.start();
receiverThread.start();
}
}
运行结果(可能每次不一样):
发送者线程:已发送a
发送者线程:已发送b
接收者线程:接收a完毕!
接收者线程:接收b完毕!
发送者线程:已发送c
发送者线程:已发送d
发送者线程:已发送e
发送者线程:已发送f
发送者线程:已发送g
发送者线程:已发送h
发送者线程:已发送i
发送者线程:已发送j
发送者线程:已发送k
发送者线程:已发送l
发送者线程:已发送m
发送者线程:已发送n
发送者线程:已发送o
发送者线程:已发送p
发送者线程:已发送q
发送者线程:已发送r
接收者线程:接收c完毕!
接收者线程:接收d完毕!
发送者线程:已发送s
发送者线程:已发送t
接收者线程:接收e完毕!
接收者线程:接收f完毕!
发送者线程:已发送u
发送者线程:已发送v
接收者线程:接收g完毕!
接收者线程:接收h完毕!
发送者线程:已发送w
发送者线程:已发送x
接收者线程:接收i完毕!
发送者线程:已发送y
接收者线程:接收j完毕!
接收者线程:接收k完毕!
发送者线程:已发送z
接收者线程:接收l完毕!
接收者线程:接收m完毕!
接收者线程:接收n完毕!
接收者线程:接收o完毕!
接收者线程:接收p完毕!
接收者线程:接收q完毕!
接收者线程:接收r完毕!
接收者线程:接收s完毕!
接收者线程:接收t完毕!
接收者线程:接收u完毕!
接收者线程:接收v完毕!
接收者线程:接收w完毕!
接收者线程:接收x完毕!
接收者线程:接收y完毕!
接收者线程:接收z完毕!