Messages entre objets de meme classe ou sous-classe

Dans le cas d'objets de meme classe tournant sur une meme machine, les communications peuvent se faire de facon tres simple par un mecanisme de memoire partagee. Il suffit de declarer des variables en static.

Applet :

Programme (corps des processus legers) :

class Mes_messages extends Thread

{

    private StringBuffer mon_nom ;

    com1 mon_pere ; // on a besoin d'une reference de l'applet pour ecrire int mon_numero ;

    boolean ok ; // va servir a bloquer le processus avant de lancer le traitement

    // variables des messages

    final int NB_PROC=3 ;

    static short status[][] ; // 0=ok en ecrit., 1=ok en lect. pour i de j

    static int message[][] ; // message pour i venant de j

    Mes_messages(com1 pere, String nom, int num)

    {

      super() ; ok = false ; mon_numero = num ;

      mon_nom = new StringBuffer(nom) ; mon_pere = pere ;

      // le 1er processus initialise les communications

      if (mon_numero == 0)

      {

        message = new int[NB_PROC][NB_PROC] ; status = new short[NB_PROC][NB_PROC] ;

        for (int i=0; i<NB_PROC ; i++)

          for (int j=0; j<NB_PROC ; j++) status[i][j] = 0 ;

      }

    }

    // run est le corps du processus

    public void run()

    {

      int i, j ;

      StringBuffer msg ;

      while (! ok) // attente bloquante pour laisser la main a l'applet

      { try { sleep(500) ; } catch (InterruptedException e) {} }

      while (true)

      {

        for (i=0 ; i<NB_PROC ; i++)

          for (j=0 ; j<NB_PROC ; j++)

          {

            if (i!=j)

            {

              if (status[i][j]==0) //droit d'ecrire

              {

                status[i][j] = 1 ; message[i][j] = (int) (Math.random()*10) ;

              } else

              {

                if (status[i][j]==1) //droit de lire

                {

                  msg = new StringBuffer(mon_nom.toString() + " a lu : ") ;

                  msg.append(message[i][j]) ;

                  mon_pere.qui_est_actif(msg) ;

                  status[i][j] = 0 ;

                }

              }

              try { sleep(500) ; } catch (InterruptedException e) {}

            }

            try { sleep(500) ; }

            catch (InterruptedException e) {}

          }

      } // boucle infinie

    }

    public void dit_ok()

    { ok = true ; }

}

NB : ce programme peut naturellement etre perfectionne avec par exemple des files d'attentes pour autoriser l'envoi de plus d'un message a la fois (d'un processus i a un processus j).


Ph. RIS 1997