Math.random()
renvoie un flottant pseudo-aléatoire
(en double précision, un double
) entre 0.0 et 1.0 (exclu).
La multiplication et la conversion de type donnent finalement
un entier pseudo-aléatoire entre 0 et 3 (exclu).NumberFormatException
).
(new Lion()).run()
. Elle crée un objet de la classe
Lion
dont la méthode run est immédiatement appelée.
Thread
a ses limites.
public static void main(String [] arg) { int n = 64 ; if (arg.length > 0) n = Integer.parseInt(arg[0]) ; Thread [] t = new Thread [n] ; for (int i = 0 ; i < n ; i++) { t[i] = new Lion() ; t[i].start() ; } try { for (int i = 0 ; i < n ; i++) { t[i].join() ; } } catch (InterruptedException e) { System.exit(2) ; } System.out.println("Bilan: " + mare) ; } |
for (int i = 0 ; i < n ; i++) { for ( ; ; ) { try { t[i].join() ; break ; } catch (InterruptedException e) { } } } |
break
.c++
n'est pas atomique, elle peut se
décomposer ainsi :
d'abord, lecture de la variable partagée c dans une case
propre à chaque thread-lion (attention c'est bien le lion qui boit,
c'est son thread qui exécute le code de la méthode boire) ;
puis incrément; et enfin écriture de la nouvelle valeur dans la
variable partagée c.synchronized
, ainsi un seul lion peut accéder au compteur
à la fois.
L'effet de synchronized
est de faire qu'au plus un thread
peut se trouver dans le code de boire (notez que ce thread
peut être prêt [voir le poly] c'est à dire ne s'exécutant pas).
On dit aussi que le code de boire est en section critique.