MAJ du site :

  • une navbar en haut, avec notamment un lien vers la chronologie, soit la liste de tous les posts, classés par ordre d’apparition.
  • des liens de navigation entre posts, pour passer aux posts précédént/suivant

Contrôler les Threads

Hier on a vu comment créer des Threads, en lancer plusieurs, et les laisser durer le temps de quelques boucles ou pendant un temps bien défini. Là on va voir comment les contrôler, en les arrêtant, les relançant…

pass

Un Thread passe la main à un autre, qui redonne la main au premier.

mon_premier = Thread.new { print "h"; Thread.pass ; print "l"; Thread.pass; print "o" }
mon_second = Thread.new { print "e"; Thread.pass ; print "l"; }
mon_premier.join
→ hello

Mon premier Thread affiche “h” puis passe la main à l’autre Thread qui affiche “e”, qui repasse la main au premier… Jusqu’à imprimer “hello”. Je mets “print” au lieu de “puts” pour éviter les retours à la ligne. J’appelle la méthode .join pour que le programme attende que le premier thread soit terminé en entier avant de s’arrêter.

stop / run

On peut arrêter un Thread, pour le relancer plus tard, après qu’une autre action ait été effectuée.

mon_thread = Thread.new do
  puts "On peut y aller ?"
  Thread.stop
  puts "Ok, go!"
end
puts "Oui c'est bon."
mon_thread.run
→ On peut y aller ?
Oui c'est bon.
Ok, go!

Ici, en créant mon Thread, j’appelle la méthode .stop sur la classe Thread (et non sur l’instance mon_thread) pour mettre en pause mon instance. On sort ensuite du bloc où j’affiche ma seconde phrase. Et après, je relance mon thread qui affiche la dernière phrase (qui n’avait pas été appelée encore).

exit / kill

On peut arrêter totalement un Thread de l’intérieur (exit) ou de l’extérieur (kill).

attention = Thread.new do
while (true):
puts "Attention"
Thread.pass
end
Thread.kill(attention)
 
end
quoi = Thread.new do
puts "Quoi ?"
Thread.exit
end
→ Attention
Quoi ?

Mon premier thread a une boucle infinie mais heureusement, juste après être sorti du bloc, j’applique la méthode .kill à la classe Thread avec en paramètre le nom de mon thread pour l’arrêter. Mon deuxième thread est lancé, affiche “Quoi ?”, mais juste après (à l’intérieur du bloc) j’appelle la méthode .exit donc elle s’arrête là. Les deux méthodes sont des méthodes de Classe et non des méthodes d’instance.