Exemple simple de processus legers passant la main

Le programme precedent permettait le temps partage en endormant chaque processus pendant quelques secondes. Une facon plus optimale de proceder et d'utiliser la methode yield() qui permet de passer la main sans perte de temps inutile (le sleep endort le processus quoi qu'il arrive, meme si personne d'autre ne veut la main).

Applet :

Comme vous le voyez (peut-etre !) d'apres l'execution de l'applet, il ne se passe pas toujours assez de temps entre deux ecritures, ce qui provoque parfois l'ecriture de deux messages sur la meme ligne. Le sleep evitait ce probleme car les processus dormant plus qu'ils ne travaillent, ce phenomene avait peut de chance de se produire.

Programme (modifications par rapport au precedent:

class Mon_processus2 extends Thread

{

    private StringBuffer mon_nom ;

    leger2 mon_pere ; // on a besoin d'une reference de l'applet pour ecrire

    int message ; // nombre de messages envoyes

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

    Mon_processus2(leger2 pere, String nom)

    { super() ; ok = false ; mon_nom = new StringBuffer(nom) ; mon_pere = pere ; }

    // run est le corps du processus

    public void run()

    {

      double k, res ; message = 0 ;

      while (! ok) // attente bloquante

      {

        try { sleep((int)(Math.random()*50.0)) ; }

        catch (InterruptedException e) {} // le sleep permet de redonner la main aux autre processus

      }

      while (message<mon_pere.NB_PROC)

      {

        res = 0.0 ;

        for (k=0.0 ; k<2.0*Math.PI ; k += Math.PI/1000) res += res + Math.sin(k) ;

        mon_pere.ecriture(mon_nom) ;

        yield() ; // modification principale

        message++ ;

      }

      jai_fini() ;

    }

    public void dit_ok()

    { ok = true ; }

    protected void jai_fini()

    { mon_pere.proc_fini() ; }

}


Ph. RIS 1997