- Inter thread communication is very common phenomenon.
- There are many ways to achieve inter thread communication.
- In current post, we will use pipes to achieve thread communication.
- Java has set of classes named PipedOutputStream & PipedInputStream to communicate between threads.
- We will create couple of threaders namely producer & consumer.
- Producer thread will produce the data & consumer thread will consume the data.
1. PipedOutputStream class:
- A piped output stream can be connected to a piped input stream to create a communications pipe.
- The piped output stream is the sending end of the pipe.
- Typically, data is written to a PipedOutputStream object by one thread and data is read from the connected PipedInputStream by some other thread.
PipedOutputStream has following constructors:
S.No | Constructor | Description |
---|---|---|
1 | PipedOutputStream() | Creates a piped output stream that is not yet connected to a piped input stream. |
2 | PipedOutputStream(PipedInputStream snk) | Creates a piped output stream connected to the specified piped input stream. |
2. PipedInputStream class:
- A piped input stream should be connected to a piped output stream.
- the piped input stream then provides whatever data bytes are written to the piped output stream.
- Typically, data is read from a PipedInputStream object by one thread and data is written to the corresponding PipedOutputStream by some other thread.
PipedInputStream has following constructors:
S.No | Constructor | Description |
---|---|---|
1 | PipedInputStream() | Creates a PipedInputStream so that it is not yet connected. |
2 | PipedInputStream(int pipeSize) | Creates a PipedInputStream so that it is not yet connected and uses the specified pipe size for the pipe's buffer. |
3 | PipedInputStream(PipedOutputStream src) | Creates a PipedInputStream so that it is connected to the piped output stream src. |
4 | PipedInputStream(PipedOutputStream src, int pipeSize) | Creates a PipedInputStream so that it is connected to the piped output stream src and uses the specified pipe size for the pipe's buffer. |
3. Producer consumer in java (PipedOutputStream/PipedInputStream)
- Create producer & consumer threads.
- Create PipedOutputStream & PipedInputStream objects.
- Connect PipedOutputStream to PipedInputStream.
- Producer thread writes data to PipedOutputStream.
- Consumer thread will read data from PipedInputStream.
4. Producer consumer thread communication in java using pipes (example)
package org.learn.concurrency; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; public class InterThreadPipeIO { public static void main(String[] args) throws IOException, InterruptedException { PipedOutputStream pipedOutputStream = new PipedOutputStream(); PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream); Producer producer = new Producer(pipedOutputStream); Consumer consumer = new Consumer(pipedInputStream); Thread pThread = new Thread(producer); Thread cThread = new Thread(consumer); pThread.start(); cThread.start(); pThread.join(); cThread.join(); pipedOutputStream.close(); pipedInputStream.close(); } } class Producer implements Runnable { private final PipedOutputStream pipedOutputStream; public Producer(PipedOutputStream pipedOutputStream) { this.pipedOutputStream = pipedOutputStream; } @Override public void run() { int index = 0; try { while (index <= 25) { System.out.println("Producer thread generating: " + index); pipedOutputStream.write(index); Thread.sleep(50); index++; } } catch (IOException | InterruptedException e) { e.printStackTrace(); } finally { try { pipedOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } class Consumer implements Runnable { private final PipedInputStream pipedInputStream; public Consumer(PipedInputStream pipedInputStream) { this.pipedInputStream = pipedInputStream; } @Override public void run() { try { while (true) { int value = pipedInputStream.read(); System.out.println("Consumer thread consuming: " + value); Thread.sleep(50); if (value == 25) break; } } catch (IOException | InterruptedException e) { e.printStackTrace(); } finally { try { pipedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
5. Producer consumer thread communication in java using pipes (example)
Producer thread generating: 0 Producer thread generating: 1 Producer thread generating: 2 Producer thread generating: 3 Producer thread generating: 4 Producer thread generating: 5 Producer thread generating: 6 Producer thread generating: 7 Producer thread generating: 8 Producer thread generating: 9 Producer thread generating: 10 Producer thread generating: 11 Producer thread generating: 12 Producer thread generating: 13 Producer thread generating: 14 Producer thread generating: 15 Producer thread generating: 16 Producer thread generating: 17 Producer thread generating: 18 Producer thread generating: 19 Consumer thread consuming: 0 Producer thread generating: 20 Consumer thread consuming: 1 Producer thread generating: 21 Consumer thread consuming: 2 Producer thread generating: 22 Consumer thread consuming: 3 Producer thread generating: 23 Consumer thread consuming: 4 Producer thread generating: 24 Consumer thread consuming: 5 Producer thread generating: 25 Consumer thread consuming: 6 Consumer thread consuming: 7 Consumer thread consuming: 8 Consumer thread consuming: 9 Consumer thread consuming: 10 Consumer thread consuming: 11 Consumer thread consuming: 12 Consumer thread consuming: 13 Consumer thread consuming: 14 Consumer thread consuming: 15 Consumer thread consuming: 16 Consumer thread consuming: 17 Consumer thread consuming: 18 Consumer thread consuming: 19 Consumer thread consuming: 20 Consumer thread consuming: 21 Consumer thread consuming: 22 Consumer thread consuming: 23 Consumer thread consuming: 24 Consumer thread consuming: 25