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.