PipedReader와 PipedWriter는 쓰레드 간 데이터를 주고 받을 때 사용된다.
다른 스트림과는 달리 입력과 출력스트림을 하나의 스트림으로 연결(connect)해서 데이터를 주고 받는다.스트림 생성 후 한 쪽 쓰레드에서 connec()를 호출하여 입력스트림과 출력스트림을 연결한다.
입출력을 마친 후에는 어느 한쪽 스트림만 닫아도 나머지 스트림은 자동으로 닫힌다.
PipedReader/PipedWriter를 이용해서 두 쓰레드가 서로 메세지를 주고 받는 예제이다.
import java.io.*;
public class Ex15_16 {
public static void main(String[] args) {
InputThread inThread = new InputThread("InputThread");
OutputThread outThread = new OutputThread("OutputThread");
// PipedReader 와 PipedWriter를 연결한다.
inThread.connect (outThread.getOutput());
inThread.start();
outThread.start();
}//main
}
class InputThread extends Thread {
PipedReader input = new PipedReader();
StringWriter sw = new StringWriter();
InputThread(String name) {
super(name); // Thread(String name);
}
public void run() {
try {
int data = 0;
while((data=input.read()) != -1) {
sw.write(data);
}
System.out.println(getName() + " received : " + sw.toString());
} catch(IOException e) {}
}//run
public PipedReader getInput() {
return input;
}
public void connect (PipedWriter output) {
try {
input.connect(output);
} catch(IOException e) {}
}// connect
}
class OutputThread extends Thread {
PipedWriter output = new PipedWriter();
OutputThread(String name) {
super(name); // Thread(String name);
}
public void run() {
try {
String msg = "Hello";
System.out.println(getName() + " sent : " + msg);
output.write(msg);
output.close();
} catch(IOException e) {}
} // run
public PipedWriter getOutput() {
return output;
}
public void connect (PipedReader input) {
try {
output.connect(input);
} catch(IOException e) {}
}//connect
}
OutputThread sent : Hello
InputThread received : Hello
쓰레드 시작 전 PipedReader와 PipedWriter를 연결해야 한다.