Il s'agit d'une technique importante pour connecter entre eux deux programmes, en connectant un flot de sortie du premier programme avec un flot d'entrée du second programme. Cette technique, dite de tube, issue d'une pratique courante dans le système Unix (appelée en anglais pipe), est appliquée ici, non à deux programmes, mais à deux agents implémentés par des threads . Les classes permettant ces connexions sortie/entrée sont :
try { PipedWriter out = new PipedWriter(); PipedReader in = new PipedReader(out); } catch (IOException e) {}
On peut alors connecter des agents p et c à l'aide de ces flots.
Producteur p = new Producteur(out); Consommateur c = new Consommateur(in);
L'écriture dans out et la lecture dans in seront réalisés par les agents eux-mêmes, dont on suppose qu'ils ont chacun leur propre thread (l'un des deux pouvant être le thread du programme principal) :
p.start(); c.start();
Dans l'exemple suivant, le producteur écrit le caractère 'a' sur son flot de sortie toutes les 1000 millisecondes ; le consommateur est continuellement en attente d'un caractère sur son flot d'entrée.
class Producteur extends Thread { private Writer out; Producteur(Writer out) { this.out = out; } public void run() { while (true) { try { out.write('a'); Thread.sleep(1000); } catch(InterruptedException e) {} catch(IOException e) {} } } } class Consommateur extends Thread { private Reader in; Consommateur(Reader in) { this.in = in; } public void run() { while (true) { try { char c = (char) in.read(); System.out.println(c); } catch(IOException e) {} } } }