Korte introductie tot Java Thread.yield ()

1. Overzicht

In deze tutorial verkennen we de methode opbrengst() in Draad klasse.

We zullen het vergelijken met andere gelijktijdigheids-idiomen die beschikbaar zijn in Java en uiteindelijk de praktische toepassingen ervan onderzoeken.

2. Synopsis van opbrengst()

Zoals de officiële documentatie suggereert, opbrengst() biedt een mechanisme om de "planner" dat te informeren de huidige thread is bereid om het huidige gebruik van de processor op te geven, maar wil zo snel mogelijk weer worden gepland.

De "planner" is vrij om deze informatie te volgen of te negeren en heeft in feite wisselend gedrag afhankelijk van het besturingssysteem.

Het volgende codefragment geeft twee threads weer met dezelfde prioriteit die na elk schema worden opgeleverd:

openbare klasse ThreadYield {openbare statische leegte hoofd (String [] args) {Runnable r = () -> {int counter = 0; while (teller <2) {System.out.println (Thread.currentThread () .getName ()); tegen ++; Thread.yield (); }}; nieuwe Thread (r) .start (); nieuwe Thread (r) .start (); }}

Als we het bovenstaande programma meerdere keren proberen uit te voeren, krijgen we verschillende resultaten; sommigen van hen worden hieronder genoemd:

Run 1:

Draad-0 Draad-1 Draad-1 Draad-0

Run 2:

Draad-0 Draad-0 Draad-1 Draad-1

Dus zoals je kunt zien het gedrag van opbrengst() is ook niet-deterministisch en platformafhankelijk.

3. Vergelijken met andere idiomen

Er zijn andere constructies om de relatieve voortgang van threads te beïnvloeden. Ze bevatten wacht(), melden () en informerenAll () als onderdeel van Voorwerp klasse, toetreden () als onderdeel van Draad klasse, en slaap() als onderdeel van Draad klasse.

Laten we eens kijken hoe ze zich verhouden tot opbrengst().

3.1. opbrengst() vs wacht()

  • Terwijl opbrengst() wordt aangeroepen in de context van de huidige thread, wacht() kan alleen worden aangeroepen op een expliciet verworven vergrendeling binnen een gesynchroniseerd blok of methode
  • in tegenstelling tot opbrengst(), het is mogelijk om te wachten() om een ​​minimale wachttijd op te geven voordat een poging wordt gedaan om de thread opnieuw te plannen
  • Met wacht() het is ook mogelijk om de thread op elk moment uit de slaapstand te halen door een aanroep van melden () of informerenAll () op het betreffende slotobject

3.2. opbrengst() vs slaap()

  • Terwijl opbrengst() kan alleen een heuristische poging doen om de uitvoering van de huidige thread op te schorten zonder garantie wanneer deze wordt terug gepland, slaap() kan de planner dwingen de uitvoering van de huidige thread op te schorten voor ten minste de genoemde tijdsperiode als zijn parameter.

3.3. opbrengst() vs toetreden ()

  • De huidige thread kan aanroepen toetreden () op een andere draad waardoor de huidige draad wacht tot de andere draad doodgaat voordat u verder gaat
  • Optioneel kan het een tijdsperiode als parameter vermelden die de maximale tijd aangeeft gedurende welke de huidige thread moet wachten voordat deze wordt hervat

4. Gebruik voor opbrengst()

Zoals de officiële documentatie suggereert, is het zelden nodig om te gebruiken opbrengst() en moet daarom worden vermeden, tenzij zeer duidelijk met de doelstellingen in het licht van zijn gedrag.

Niettemin, sommige gebruiken voor opbrengst() omvatten het ontwerpen van concurrency-besturingsconstructies, het verbeteren van de systeemresponsiviteit in een programma met veel rekenkracht, enz.

Dit gebruik moet echter gepaard gaan met gedetailleerde profilering en benchmarking om het gewenste resultaat te garanderen.

5. Conclusie

In dit korte artikel hebben we de opbrengst() methode in de Draad class en zag zijn gedrag en beperkingen door middel van een codefragment.

We hebben ook de vergelijking onderzocht met andere gelijktijdigheids-idiomen die beschikbaar zijn in Java en hebben uiteindelijk gekeken naar enkele van de use-cases waar opbrengst() kan nuttig zijn.

Zoals altijd kun je de voorbeelden in dit artikel bekijken op GitHub.