Lion
) en compétition dans la jungle pour l'accès à un
point d'eau (objet Mare
).
La mare est équipée d'un dispositif automatique qui enregistre
chaque lion venant boire :
class Mare { private int c ; Mare() { c = 0 ; } void boire() { c++ ; } public String toString() { return Integer.toString(c) ; } } |
Lion
modélise les lions.
Le comportement typique du lion est
d'aller boire entre zéro et deux fois, puis d'aller se coucher
(méthode run).
class Lion extends Thread { static Mare mare = new Mare() ; public void run() { for (int i = (int)(Math.random() * 3) ; i > 0 ; i--) mare.boire() ; } public static void main(String [] arg) { int n = 64 ; if (arg.length > 0) n = Integer.parseInt(arg[0]) ; for (int i = 0 ; i < n ; i++) { new Lion().run() ; } System.out.println("Bilan: " + mare) ; } } |
main
procède au réveil des n lions, puis à la
lecture du dispositif de la mare. Elle incarne le zoologue.
Math.random()
?
new Lion().run()
?
new Lion().run()
, par
new Lion().start()
et on suppose qu'il n'y a que deux
lions buvant chacun une fois.
Donner trois sénarios (de scheduling) conduisant à afficher
respectivement 0, 1 et 2.Tread
.
L'appel t.join()
retourne normalement quand
l'exécution du thread t est terminée.InterruptedException
quand ce
thread en attente est interrompu par un troisième larron (qui appelle sa
méthode interrupt).RdV
suivante :
class RdV { boolean someone ; RdV () { someone = false ; } synchronized void sync() { if (someone) { System.out.println() ; someone = false ; notify() ; } else { someone = true ; try { wait() ; } catch (InterruptedException e) { System.exit(2) ; } } } } |
RdV
fraîchement créé.
Que se passe-t-il lorsque t0 appelle sync() de r,
puis lorsque t1 appelle sync() de r.
class Two extends Thread { static RdV rdv = new RdV () ; char id ; Two(char id) { this.id = id ; } public void run() { for (int i = 0 ; i < 10 ; i++) { System.out.print(id) ; rdv.sync() ; } } public static void main (String [] arg) { new Two('A').start() ; new Two('B').start() ; } } |
'A'
meurt inopinément (par
exemple il déréférence bêtement null
). Que se passe-t-il ?new Two('C')
.
System.out.print
ne revient pas avant que le caractère ne
soit effectivement affiché.
class All extends Thread { static Barrier rdv ; char id ; All(char id) { this.id = id ; } public void run() { for (int i = 0 ; i < 10 ; i++) { System.out.print(id) ; rdv.sync() ; } } public static void main (String [] arg) { int n = 26 ; rdv = new Barrier(n) ; for (int i = 0 ; i < n ; i++) new All((char)('A' + i)).start() ; } } |
Barrier
.All
pour utiliser la nouvelle
barrière. Annoncer les affichages résultant des modifications.Ce document a été traduit de LATEX par HEVEA et HACHA.