Brève introduction à Java Thread.yield ()

1. Vue d'ensemble

Dans ce tutoriel, nous allons explorer la méthode yield () dans la classe Thread .

Nous le comparerons avec d'autres idiomes de concurrence disponibles en Java et en explorerons éventuellement les applications pratiques.

2. Synopsis de yield ()

Comme le suggère la documentation officielle, yield () fournit un mécanisme pour informer le «planificateur» que le thread actuel est prêt à renoncer à son utilisation actuelle du processeur mais qu'il aimerait être programmé le plus tôt possible.

Le «planificateur» est libre d'adhérer ou d'ignorer ces informations et, en fait, son comportement varie en fonction du système d'exploitation.

Le fragment de code suivant affiche deux threads ayant la même priorité après chaque planification:

public class ThreadYield { public static void main(String[] args) { Runnable r = () -> { int counter = 0; while (counter < 2) { System.out.println(Thread.currentThread() .getName()); counter++; Thread.yield(); } }; new Thread(r).start(); new Thread(r).start(); } }

Lorsque nous essayons d'exécuter le programme ci-dessus plusieurs fois, nous obtenons des résultats différents; certains d'entre eux sont mentionnés ci-dessous:

Exécution 1:

Thread-0 Thread-1 Thread-1 Thread-0

Exécution 2:

Thread-0 Thread-0 Thread-1 Thread-1

Ainsi, comme vous pouvez le voir, le comportement de yield () n'est pas déterministe et dépend également de la plate-forme.

3. Comparaison avec d'autres expressions idiomatiques

Il existe d'autres constructions pour affecter la progression relative des threads. Ils incluent wait () , notify () et notifyAll () dans le cadre de la classe Object , join () dans le cadre de la classe Thread et sleep () dans le cadre de la classe Thread .

Voyons comment ils se comparent à yield () .

3.1. yield () vs wait ()

  • Alors que yield () est invoqué dans le contexte du thread actuel, wait () ne peut être invoqué que sur un verrou acquis explicitement à l'intérieur d'un bloc ou d'une méthode synchronisée
  • Contrairement à yield () , il est possible pour wait () de spécifier une période minimale d'attente avant toute tentative de planification du thread à nouveau
  • Avec wait (), il est également possible de réveiller le thread à tout moment via un appel de notify () ou notifyAll () sur l'objet verrou concerné

3.2. yield () vs sleep ()

  • Alors que yield () ne peut faire qu'une tentative heuristique de suspendre l'exécution du thread actuel sans aucune garantie de quand il sera programmé, sleep () peut forcer le planificateur à suspendre l'exécution du thread courant au moins pendant le temps mentionné période comme paramètre.

3.3. yield () vs join ()

  • Le thread actuel peut invoquer join () sur n'importe quel autre thread, ce qui oblige le thread actuel à attendre que l'autre thread meure avant de continuer
  • En option, il peut mentionner une période comme paramètre qui indique la durée maximale pendant laquelle le thread actuel doit attendre avant de reprendre

4. Utilisation pour yield ()

Comme le suggère la documentation officielle, il est rarement nécessaire d'utiliser yield () et doit donc être évité à moins d'être très clair avec les objectifs à la lumière de son comportement.

Néanmoins, certaines utilisations de yield () incluent la conception de constructions de contrôle de concurrence, l'amélioration de la réactivité du système dans un programme lourd en calcul, etc.

Cependant, ces usages doivent être accompagnés d'un profilage détaillé et d'une analyse comparative pour garantir le résultat souhaité.

5. Conclusion

Dans ce bref article, nous avons discuté de la méthode yield () dans la classe Thread et vu son comportement et ses limitations à travers un fragment de code.

Nous avons également exploré sa comparaison avec d'autres idiomes de concurrence disponibles en Java et enfin examiné certains des cas d'utilisation où yield () pourrait être utile.

Comme toujours, vous pouvez consulter les exemples fournis dans cet article sur GitHub.