import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Main {
public static void main(String args[]) {
Thread thread1 = new Thread(new PipeOutput("Producer"));
Thread thread2 = new Thread(new PipeInput("Consumer"));
thread1.start();
thread2.start();
boolean thread1IsAlive = true;
boolean thread2IsAlive = true;
do {
if (thread1IsAlive && !thread1.isAlive()) {
thread1IsAlive = false;
}
if (thread2IsAlive && !thread2.isAlive()) {
thread2IsAlive = false;
}
} while (thread1IsAlive || thread2IsAlive);
}
}
class PipeIO {
PipedOutputStream outputPipe = new PipedOutputStream();
PipedInputStream inputPipe = new PipedInputStream();
String name;
public PipeIO(String id) {
name = id;
try {
outputPipe.connect(inputPipe);
} catch (IOException ex) {
System.out.println("IOException in static initializer");
}
}
}
class PipeOutput extends PipeIO implements Runnable {
public PipeOutput(String id) {
super(id);
}
public void run() {
String s = "This is a test.";
try {
for (int i = 0; i < s.length(); ++i) {
outputPipe.write(s.charAt(i));
System.out.println(name + " wrote " + s.charAt(i));
}
outputPipe.write('!');
} catch (IOException ex) {
System.out.println("IOException in PipeOutput");
}
}
}
class PipeInput extends PipeIO implements Runnable {
public PipeInput(String id) {
super(id);
}
public void run() {
boolean eof = false;
try {
while (!eof) {
int inChar = inputPipe.read();
if (inChar != -1) {
char ch = (char) inChar;
if (ch == '!') {
eof = true;
break;
} else
System.out.println(name + " read " + ch);
}
}
} catch (IOException ex) {
System.out.println("IOException in PipeOutput");
}
}
}