说明:
通过输入输出在线程间进行通信。提供线程功能的类库已“管道”的形式对线程间的输入输出提供支持。
Java中对应的类PipedWriter(允许线程在管道写)与PipedReader(允许不同线程从同一管道中读取)
这模型可以看做是生产者与消费者的变体
package com.t1009;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
import java.util.Random;
class Sender extends Thread {
private Random rand = new Random();
private PipedWriter out = new PipedWriter();
public PipedWriter getPipedWriter() {
return out;
}
@Override
public void run() {
while (true) {
for (char c = 'A'; c <= 'z'; c++) {
try {
System.out.println("把 "+c+" 写进去了");
out.write(c);
sleep(rand.nextInt(500));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
class Receiver extends Thread {
private PipedReader in;
public Receiver(Sender sender) throws IOException {
in = new PipedReader(sender.getPipedWriter());
}
@Override
public void run() {
try {
while (true) {
System.out.println("Read " + (char) in.read());
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public class PipedIO {
public static void main(String[] args) throws IOException {
Sender sender = new Sender();
Receiver receiver = new Receiver(sender);
sender.start();
receiver.start();
}
}
输出部分结果:
把 A 写进去了
把 B 写进去了
把 C 写进去了
把 D 写进去了
把 E 写进去了
把 F 写进去了
Read A
Read B
Read C
Read D
Read E
Read F
把 G 写进去了
把 H 写进去了
把 I 写进去了
把 J 写进去了
Read G
Read H
Read I
Read J
把 K 写进去了
把 L 写进去了
Read K
Read L
把 M 写进去了
把 N 写进去了
把 O 写进去了
把 P 写进去了
Read M
Read N
Read O
Read P
把 Q 写进去了
把 R 写进去了
把 S 写进去了
Read Q
Read R
Read S
把 T 写进去了
把 U 写进去了
把 V 写进去了
把 W 写进去了
Read T
Read U
Read V
Read W
把 X 写进去了
把 Y 写进去了
把 Z 写进去了
把 [ 写进去了
把 \ 写进去了
Read X
Read Y
Read Z
Read [
Read \
把 ] 写进去了
把 ^ 写进去了
把 _ 写进去了
把 ` 写进去了
把 a 写进去了
把 b 写进去了
Read ]
Read ^
Read _
Read `
Read a
Read b
把 c 写进去了
把 d 写进去了
Read c
Read d
把 e 写进去了
把 f 写进去了
把 g 写进去了
把 h 写进去了
Read e
Read f
Read g
Read h