Kort introduktion til Java Thread.yield ()

1. Oversigt

I denne vejledning undersøger vi metoden udbytte() i Tråd klasse.

Vi sammenligner det med andre samtidige idiomer tilgængelige i Java og til sidst udforsker de praktiske anvendelser af det.

2. Sammendrag af udbytte()

Som den officielle dokumentation antyder, udbytte() giver en mekanisme til at informere "planlæggeren" om det den aktuelle tråd er villig til at opgive sin nuværende brug af processor, men den vil gerne planlægges tilbage hurtigst muligt.

"Planlæggeren" kan frit overholde eller ignorere disse oplysninger og har faktisk forskellige adfærd afhængigt af operativsystemet.

Følgende kodefragment viser to tråde med samme prioritet og giver efter hver tidsplan:

public class ThreadYield {public static void main (String [] args) {Runnable r = () -> {int counter = 0; mens (tæller <2) {System.out.println (Thread.currentThread () .getName ()); tæller ++; Thread.yield (); }}; ny tråd (r) .start (); ny tråd (r) .start (); }}

Når vi forsøger at køre ovenstående program flere gange, får vi forskellige resultater; nogle af dem er nævnt nedenfor:

Kørsel 1:

Tråd-0 Tråd-1 Tråd-1 Tråd-0

Kørsel 2:

Tråd-0 Tråd-0 Tråd-1 Tråd-1

Så som du kan se opførslen af udbytte() er ikke-deterministisk og platformafhængig.

3. Sammenligning med andre udtryk

Der er andre konstruktioner til at påvirke den relative progression af tråde. De omfatter vente(), underrette() og notifyAll () som en del af Objekt klasse, tilslutte() som en del af Tråd klasse og søvn() som en del af Tråd klasse.

Lad os se, hvordan kan de sammenlignes med udbytte().

3.1. udbytte() vs. vente()

  • Mens udbytte() påberåbes i forbindelse med den aktuelle tråd, vente() kan kun påberåbes på en eksplicit erhvervet lås inde i en synkroniseret blok eller metode
  • I modsætning til udbytte(), det er muligt at vente() for at angive en minimumsperiode, der skal ventes, før ethvert forsøg på at planlægge tråden igen
  • Med vente() det er også muligt at vække tråden når som helst gennem en påkaldelse af underrette() eller notifyAll () på det pågældende låseobjekt

3.2. udbytte() vs. søvn()

  • Mens udbytte() kan kun gøre et heuristisk forsøg på at suspendere udførelsen af ​​den aktuelle tråd uden garanti for hvornår vil den blive planlagt tilbage, søvn() kan tvinge planlæggeren til at suspendere udførelsen af ​​den aktuelle tråd i mindst den nævnte tidsperiode som parameter.

3.3. udbytte() vs. tilslutte()

  • Den aktuelle tråd kan påberåbes tilslutte() på enhver anden tråd, der får den aktuelle tråd til at vente på, at den anden tråd dør, inden du fortsætter
  • Valgfrit kan den nævne en tidsperiode som sin parameter, der angiver den maksimale tid, som den aktuelle tråd skal vente på, før den genoptages

4. Anvendelse til udbytte()

Som den officielle dokumentation antyder, er det sjældent nødvendigt at bruge det udbytte() og bør derfor undgås, medmindre det er meget klart med målene i lyset af dets adfærd.

Ikke desto mindre noget til brug for udbytte() inkluderer design af samtidskontrolkonstruktioner, forbedring af systemets respons i et beregningstungt program osv.

Disse anvendelser skal dog ledsages af detaljeret profilering og benchmarking for at sikre det ønskede resultat.

5. Konklusion

I denne korte artikel diskuterede vi udbytte() metode i Tråd klasse og så dens opførsel og begrænsninger gennem et kodefragment.

Vi undersøgte også dens sammenligning med andre samtidige idiomer, der er tilgængelige i Java, og så endelig på nogle af de anvendelsestilfælde, hvor udbytte() kan være nyttigt.

Som altid kan du tjekke eksemplerne i denne artikel på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found