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