Kurze Einführung in Java Thread.yield ()

1. Übersicht

In diesem Tutorial werden wir die Methode yield () in der Thread- Klasse untersuchen.

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

2. Zusammenfassung des Ertrags ()

Wie aus der offiziellen Dokumentation hervorgeht, bietet Yield () einen Mechanismus, um den "Scheduler" darüber zu informieren, dass der aktuelle Thread bereit ist, auf die derzeitige Verwendung des Prozessors zu verzichten, aber er möchte so bald wie möglich zurückgesetzt werden.

Dem „Scheduler“ steht es frei, diese Informationen einzuhalten oder zu ignorieren, und er hat je nach Betriebssystem ein unterschiedliches Verhalten.

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

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, ist das Verhalten vonield () nicht deterministisch und auch plattformabhängig.

3. Vergleich mit anderen Redewendungen

Es gibt andere Konstrukte, die den relativen Verlauf von Threads beeinflussen. Dazu gehören wait () , notify () und notifyAll () als Teil der Object- Klasse, join () als Teil der Thread- Klasse und sleep () als Teil der Thread- Klasse.

Mal sehen, wie sie sich mitield () vergleichen .

3.1. Yield () vs Wait ()

  • Während der Ausbeute () im Kontext des aktuellen Threads aufgerufen wird, wait () kann nur in einem synchronisierten Block oder das Verfahren auf einer explizit aufgerufen werden Sperre erworben
  • Im Gegensatz zuield () kann wait () eine Mindestwartezeit angeben, bevor gewartet wird, um den Thread erneut zu planen
  • Mit wait () ist es auch möglich , den Faden jederzeit durch einen Aufruf von aufzuwecken notify () oder notifyAll () auf dem betreffenden Verriegelungsobjekt

3.2. Ausbeute () gegen Schlaf ()

  • Während Ausbeute () nur einen heuristischen Versuch machen kann , die Ausführung des aktuellen Threads ohne die Garantie zu suspendieren wann wird es wieder eingeplant werden, sleep () kann den Scheduler zwingen , die Ausführung des aktuellen Threads für zumindest die oben genannte Zeit auszusetzen Punkt als Parameter.

3.3. Yield () vs Join ()

  • Der aktuelle Thread kann join () 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, auf die der aktuelle Thread warten soll, bevor er fortgesetzt wird

4. Verwendung für Ausbeute ()

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

Nichtsdestotrotz umfassen einige der Anwendungen fürield () das Entwerfen von Konstrukten zur Steuerung der Parallelität, die Verbesserung der Systemreaktivität in einem rechenintensiven Programm usw.

Diese Verwendungen müssen jedoch von einer detaillierten Profilerstellung und einem Benchmarking begleitet sein, um das gewünschte Ergebnis sicherzustellen.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir die Yield () -Methode in der Thread- Klasse diskutiert 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 denenield () nützlich sein könnte.

Wie immer können Sie die Beispiele in diesem Artikel auf GitHub nachlesen.