Brève introduction à Java Thread.yield ()

Brève introduction à Java Thread.yield ()

1. Vue d'ensemble

Dans ce tutoriel, nous allons explorer la méthodeyield() dans la classeThread.

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

2. Synopsis deyield()

Comme le suggère la documentation officielle,yield() fournit un mécanisme pour informer le «planificateur» quethe current thread is willing to relinquish its current use of processor but it’d like to be scheduled back soon as possible.

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

Le fragment de code suivant affiche deux threads ayant la même priorité et qui cèdent 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:

Run 1:

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

Run 2:

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

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

3. Comparaison avec d'autres idiomes

Il y a d'autres constructions pour affecter la progression relative des threads. Ils incluentwait(),notify() etnotifyAll() dans la classeObject,join() dans la classeThread etsleep() dans le cadre de la classeThread.

Voyons comment ils se comparent àyield().

3.1. yield() contrewait()

  • Alors queyield() est invoqué dans le contexte du thread courant,wait() ne peut être appelé que sur un verrou acquis explicitement à l'intérieur d'un bloc ou d'une méthode synchronisés

  • Contrairement àyield(), il est possible pour wait() de spécifier une période minimale d'attente avant toute tentative de planification du thread à nouveau

  • Avecwait(), il est également possible de réveiller le thread à tout moment en invoquantnotify() ounotifyAll() sur l'objet verrou concerné

3.2. yield() contresleep()

  • Alors queyield() ne peut faire 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 pendant à au moins la période mentionnée comme paramètre.

3.3. yield() contrejoin()

  • Le thread actuel peut invoquerjoin() 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 en tant que paramètre indiquant la durée maximale pendant laquelle le thread en cours doit attendre avant de reprendre.

4. Utilisation pouryield()

Comme le suggère la documentation officielle, il est rarement nécessaire d’utiliseryield() et doit donc être évité à moins que les objectifs ne soient clairement définis à la lumière de son comportement.

Néanmoins, certaines des utilisations deyield() 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 afin de garantir le résultat souhaité.

5. Conclusion

Dans ce bref article, nous avons discuté de la méthodeyield() dans la classeThread et vu son comportement et ses limites à 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 articleover on GitHub.