Kurze Einführung in Java Thread.yield ()

Kurze Einführung in Java Thread.yield ()

1. Überblick

In diesem Tutorial werden wir die Methodeyield() in der KlasseThreaduntersuchen.

Wir werden es mit anderen in Java verfügbaren Parallelitäts-Idiomen vergleichen und schließlich die praktischen Anwendungen untersuchen.

2. Synopsis vonyield()

Wie aus der offiziellen Dokumentation hervorgeht, bietetyield() einen Mechanismus, um den „Scheduler“ überthe current thread is willing to relinquish its current use of processor but it’d like to be scheduled back soon as possible. zu informieren

Es steht dem "Planer" frei, diese Informationen einzuhalten oder zu ignorieren, und er verhält sich je nach Betriebssystem unterschiedlich.

Das folgende Codefragment zeigt nach jedem Zeitplan zwei Threads mit derselben Priorität an:

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();
    }
}

Wenn wir versuchen, das obige Programm mehrmals auszuführen, erhalten wir unterschiedliche Ergebnisse. Einige von ihnen sind unten aufgeführt:

Lauf 1:

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

Lauf 2:

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

Wie Sie sehen können, ist das Verhalten vonyield() nicht deterministisch und auch plattformabhängig.

3. Vergleichen mit anderen Redewendungen

Es gibt andere Konstrukte, um den relativen Verlauf von Threads zu beeinflussen. Sie umfassenwait(),notify() undnotifyAll() als Teil der KlasseObject,join() als Teil der KlasseThread undsleep() als Teil der Klasse vonThread.

Mal sehen, wie sie mityield() verglichen werden.

3.1. yield() vswait()

  • Währendyield() im Kontext des aktuellen Threads aufgerufen wird, kannwait() nur für eine explizit erfasste Sperre innerhalb eines synchronisierten Blocks oder einer synchronisierten Methode aufgerufen werden

  • Im Gegensatz zuyield() kann wait() eine Mindestwartezeit angeben, bevor gewartet wird, um den Thread erneut zu planen

  • Mitwait() ist es auch möglich, den Thread jederzeit durch einen Aufruf vonnotify() odernotifyAll() für das betreffende Sperrobjekt zu aktivieren

3.2. yield() vssleep()

  • Währendyield() nur einen heuristischen Versuch unternehmen kann, die Ausführung des aktuellen Threads anzuhalten, ohne zu garantieren, wann er zurück geplant wird, könnensleep() den Scheduler zwingen, die Ausführung des aktuellen Threads für at anzuhalten mindestens den genannten Zeitraum als Parameter.

3.3. yield() vsjoin()

  • Der aktuelle Thread kannjoin() für jeden anderen Thread aufrufen, wodurch der aktuelle Thread darauf wartet, dass der andere Thread stirbt, bevor er fortfährt

  • Optional kann ein Zeitraum als Parameter angegeben werden, der die maximale Zeit angibt, für die der aktuelle Thread vor der Wiederaufnahme warten soll

4. Verwendung füryield()

Wie aus der offiziellen Dokumentation hervorgeht, ist die Verwendung vonyield() selten erforderlich und sollte daher vermieden werden, es sei denn, die Ziele sind im Lichte ihres Verhaltens sehr klar.

Nichtsdestotrotz umfasst ein Teil der Verwendung füryield() das Entwerfen von Konstrukten zur Steuerung der Parallelität, das Verbessern der Systemreaktivität in einem rechenintensiven Programm usw.

Diese Verwendungen müssen jedoch von einem detaillierten Profiling und Benchmarking begleitet werden, um das gewünschte Ergebnis zu erzielen.

5. Fazit

In diesem kurzen Artikel haben wir die Methodeyield()in der KlasseThreadbesprochen und ihr Verhalten und ihre Einschränkungen anhand eines Codefragments gesehen.

Wir haben auch den Vergleich mit anderen in Java verfügbaren Parallelitäts-Idiomen untersucht und schließlich einige Anwendungsfälle untersucht, in denenyield() nützlich sein könnten.

Wie immer können Sie sich die Beispiele in diesem Artikelover on GitHub ansehen.