CodeWithInheritableLocal.java

public class CodeWithInheritableLocal implements Runnable {
  // Profondeur maximale de l'arbre "généalogique" des processus légers
  final static int MAX_LEVEL = 4;
  // Variable locale "héritable" représentant le niveau de parenté,
  // initialisée par initialValue() et transmise par chidValue()
  // (redéfinition de ces méthodes dans une classe interne anonyme).
  public InheritableThreadLocal level = new InheritableThreadLocal() {
      /**
       * Calcule la valeur de cette variable locale héritable pour le
       * processus léger fils à partir de sa valeur dans le père. Ici,
       * cela consiste à incrémenter la valeur entière représentée.
       */
      protected Object childValue(Object parentValue) {
    System.out.println(Thread.currentThread().getName() +
               ": appel à childValue()");
    return new Integer(((Integer)parentValue).intValue() + 1);
      }
      /**
       * Fournit la valeur initiale de cette variable locale héritable.
       */
      protected Object initialValue() {
    System.out.println(Thread.currentThread().getName() +
               ": appel à initialValue()");
    return new Integer(0);
      }
    };  
  /**
   * Code à exécuter par les processus légers ayant cet objet pour cible.
   */
  public void run() {
    System.out.println(Thread.currentThread().getName() +
               ": niveau de parenté " + level.get());
    // Si le niveau de création de processus léger est inférieur à
    // MAX_LEVEL, on crée et démarre un fils exécutant la même cible
    if (((Integer)level.get()).intValue() < MAX_LEVEL) {
      String name = "fils de " + Thread.currentThread().getName();
      Thread child = new Thread(this,name);
      System.out.println("Démarrage d'un nouveau processus léger");
      child.start();
    }
} }