6.1.9 Pipe

Die Erzeugung und Verwendung einer Pipe zur Kommunikation zwischen zwei Threads soll in diesem Programm möglichst einfach erläutert werden.

Source-Code Pipe (Dateiname Pipe.java):

import java.io.*;

class CountingThread extends Thread {
 PipedInputStream pipein;           // Klasse wird von Thread abgeleitet

 public CountingThread(PipedInputStream pipein){  // Konstruktor
  this.pipein = pipein;             // Stream Objekt zum Lesen
 };                                 // der Pipe wird uebernommen

 public void run(){
  int lauf,lauf2,hilf;              // Hilfsvariablen
  int ende=0;
  byte lese[]=new byte[1];          // Feld um das augelesene
                                    // Byte zu speichern
  int ausgabe;                      // Hilfsvariablen zum
  String umwandeln;                 // Umformen  der Ausgabe

  while(true)
  {
   try {ende=pipein.read(lese,0,1);}    // Pipe wird ausgelesen
   catch (IOException e) {}
   if(ende==-1) break;                  // bis -1 zurueckgegeben wird

   umwandeln=""+lese[0];                // Daten aus der Pipe
   ausgabe = Byte.parseByte(umwandeln); // werden fuer die
                                        // Ausgabe umgewandelt

   System.out.println("Thread 1 : "+ausgabe+" aus der Pipe ausgelesen");

   for(lauf=0;lauf<=10000;lauf++)       // Schleife um das System
    for(lauf2=0;lauf2<=100;lauf2++);    // zu belasten
  }
  try {pipein.close();}                 // Schliesst den Stream
  catch(IOException e){}
 }
}

class CountingThreadRunnable implements Runnable {
                                // Klasse mit dem Interface Runnable
 PipedOutputStream pipeout;

 public CountingThreadRunnable(PipedOutputStream pipeout){
                                // Konstruktor
  this.pipeout=pipeout;         // Stream Objekt zum Schreiben
 };                             // in die Pipe wird uebernommen

 public void run(){
  int lauf,lauf2,hilf;
  String umwandeln;
  byte schreibe[] = new byte[1] ;

  for(hilf=0;hilf<=10;hilf++)     // 10 mal wird eine Zahl in
  {                               // die Pipe geschrieben

   umwandeln=""+hilf;                     // Zahl wird zum
   schreibe[0]=Byte.parseByte(umwandeln); // Schreiben umgewandelt

   try {pipeout.write(schreibe,0,1);}     // Daten werden in die
   catch(IOException e){}                 // Pipe geschrieben

   System.out.println("             Thread 2 : "+hilf+" in die Pipe geschrieben");

   for(lauf=0;lauf<=10000;lauf++)       // Schleife um das System
    for(lauf2=0;lauf2<=90;lauf2++);     // zu belasten
  }
   try {pipeout.close();}               // Schliesst den Stream
   catch(IOException e){}
 }
}


class Pipe {                              // Main-Methode

 public static void main(String[] args) {
  int read;
  byte buffer[] = new byte[20];

  System.out.println("Zum Starten und Beenden bitte Eingabetaste druecken");
  try {read = System.in.read(buffer,0,20);}
  catch (IOException e ){};

  PipedInputStream pipein = new PipedInputStream();
  PipedOutputStream pipeout = new PipedOutputStream();
          // Erzeugen der Stream-Objekte zum Schreiben und Lesen

  try {pipeout.connect(pipein);}          // Kopplung der Streams
  catch  (IOException e) {}

  System.out.println("Threads gestartet\n");
  Runnable rthread = new CountingThreadRunnable(pipeout);
  Thread thread2 = new Thread(rthread);
  CountingThread thread1 = new CountingThread(pipein);
        // Erzeugung der Threads mit Uebergabe der Stream-Objekte

  thread1.start();                        // Starten der Threads
  thread2.start();

  try {read = System.in.read(buffer,0,20);}
  catch (IOException e ){};
  thread1.stop();
  thread2.stop();               // Threads werden gestoppt,
 }                              // wenn sie nicht beendet sind
}


Bildschirmausgabe Pipe: