Pipe the output of a thread to the input of another oneTag(s): Thread
We use the PipedOutputStream/PipedInputStream duo. When these streams are connected together what is written in the PipedOutputStream can be read in PipedInputStream. That connection acts like a queue (FIFO).
Pipeline Thread
+----------+ +----------+
| thread A | --- > | thread B |
+----------+ +----------+
(PRODUCE) (CONSUME)
[ProduceData.java]
import java.io.*;
public abstract class ProduceData implements Runnable {
OutputStream os;
public ProduceData(OutputStream os) {
this.os = os;
Thread t = new Thread(this);
t.start();
}
public abstract boolean dataProduction();
public void run() {
while(dataProduction()) ;
}
}[ConsumeData.java]
import java.io.*;
public abstract class ConsumeData implements Runnable {
InputStream is;
public ConsumeData(InputStream is) {
this.is = is;
Thread t = new Thread(this);
t.start();
}
public abstract boolean dataConsumption();
public void run(){
while(dataConsumption());
}
}Next we implement the methods to prepare/send the data.
[SendProduction.java]
import java.io.*;
public class SendProduction extends ProduceData {
OutputStream output;
SendProduction(OutputStream os) {
super(os);
this.output = os;
}
public boolean dataProduction() {
byte[] j = new byte[1];
boolean done = false;
java.util.Random r = new java.util.Random();
while(!done) {
try {
j[0] = (byte)(Math.abs(r.nextInt()) % 255);
System.out.print(".");
output.write(j);
}
catch (Exception e) {
e.printStackTrace();
return true;
}
}
return done;
}
}We implement the method to receive and process the data.
[ReceiveProduction.java]
import java.io.*;
public class ReceiveProduction extends ConsumeData {
InputStream input;
ReceiveProduction(InputStream is) {
super(is);
this.input = is;
}
public boolean dataConsumption() {
int i = 0;
try {
for (;;) {
i = input.read();
System.out.println(" " + i);
}
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
}[TestThread.java]
import java.io.*;
public class TestThread {
public static void main(String a[]){
try {
PipedOutputStream os = new PipedOutputStream();
PipedInputStream is = new PipedInputStream();
os.connect(is);
new SendProduction(os);
new ReceiveProduction(is);
}
catch (Exception e) {}
}
}
mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com