Kort introduksjon til Java Thread.yield ()

1. Oversikt

I denne opplæringen vil vi utforske metoden utbytte() i Tråd klasse.

Vi vil sammenligne det med andre samtidige idiomer som er tilgjengelige i Java, og til slutt utforske de praktiske anvendelsene av det.

2. Sammendrag av utbytte()

Som den offisielle dokumentasjonen antyder, utbytte() gir en mekanisme for å informere "planleggeren" om det den nåværende tråden er villig til å gi avkall på den nåværende bruken av prosessoren, men den vil bli planlagt tilbake snart som mulig.

"Planleggeren" er fri til å følge eller ignorere denne informasjonen, og har faktisk ulik oppførsel avhengig av operativsystem.

Følgende kodefragment viser to tråder med samme prioritet som gir etter hver tidsplan:

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

Når vi prøver å kjøre ovennevnte program flere ganger, får vi forskjellige resultater; noen av dem er nevnt nedenfor:

Kjør 1:

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

Kjør 2:

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

Så som du kan se oppførselen til utbytte() er ikke-deterministisk og plattformavhengig også.

3. Sammenligning med andre idiomer

Det er andre konstruksjoner for å påvirke den relative utviklingen av tråder. De inkluderer vente(), gi beskjed() og notifyAll () som en del av Gjenstand klasse, bli med() som en del av Tråd klasse, og søvn() som en del av Tråd klasse.

La oss se hvordan de sammenlignes med utbytte().

3.1. utbytte() vs. vente()

  • Samtidig som utbytte() påkalles i sammenheng med den gjeldende tråden, vente() kan bare påberopes på en eksplisitt anskaffet lås inne i en synkronisert blokk eller metode
  • I motsetning til utbytte(), det er mulig å vente() for å spesifisere en minimumsperiode å vente på før du prøver å planlegge tråden igjen
  • Med vente() det er også mulig å vekke tråden når som helst gjennom en påkalling av gi beskjed() eller notifyAll () på den aktuelle låseobjektet

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

  • Samtidig som utbytte() kan bare gjøre et heuristisk forsøk på å suspendere kjøringen av den gjeldende tråden uten garanti for når vil den bli planlagt tilbake, søvn() kan tvinge planleggeren til å avbryte kjøringen av den gjeldende tråden i minst den nevnte tidsperioden som parameter.

3.3. utbytte() vs. bli med()

  • Gjeldende tråd kan påberope seg bli med() på en hvilken som helst annen tråd som får den nåværende tråden til å vente på at den andre tråden skal dø før du fortsetter
  • Eventuelt kan den nevne en tidsperiode som parameter som angir den maksimale tiden den nåværende tråden skal vente før den gjenopptas

4. Bruk for utbytte()

Som den offisielle dokumentasjonen antyder, er det sjelden nødvendig å bruke det utbytte() og bør derfor unngås med mindre det er veldig klart med målene i lys av dens oppførsel.

Likevel, noe av bruk for utbytte() inkluderer design av samtidskontrollkonstruksjoner, forbedring av systemets respons i et beregningstungt program etc.

Imidlertid må disse bruksområdene ledsages av detaljert profilering og benchmarking for å sikre ønsket resultat.

5. Konklusjon

I denne korte artikkelen diskuterte vi utbytte() metoden i Tråd klasse og så oppførselen og begrensningene gjennom et kodefragment.

Vi undersøkte også sammenligningen mot andre samtidige idiomer som er tilgjengelige i Java, og til slutt så på noen av brukssakene der utbytte() kan være nyttig.

Som alltid kan du sjekke eksemplene i denne artikkelen på GitHub.


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