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: