next up previous contents index
Next: Un pattern de création Up: Patterns Previous: Les flots et l'Internet

   
Communication entre agents par tubes

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 :

Un tube d'entrée doit être connecté à un tube de sortie. Considérons une classe Producteur, dont un constructeur prend en argument un flot de sortie out, et une classe Consommateur, dont un constructeur prend en argument un flot d'entrée in. Comme on doit connecter in et out, ces flots doivent être des tubes, par exemple de caractères :

  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) {}
    }
  }
}


next up previous contents index
Next: Un pattern de création Up: Patterns Previous: Les flots et l'Internet
R. Lalement
2000-10-23