Kratki uvod u Java Thread.yield ()

1. Pregled

U ovom uputstvu istražit ćemo metodu prinos() u Nit razred.

Usporedit ćemo ga s drugim idiomima istodobnosti koji su dostupni na Javi i na kraju istražiti njegove praktične primjene.

2. Sadržaj prinos()

Kao što službena dokumentacija sugerira, prinos() pruža mehanizam za obavještavanje "planera" da trenutna nit spremna je odreći se trenutne upotrebe procesora, ali bi htjela da se što prije zakaže.

"Planer" je slobodan pridržavati se ili zanemariti ove informacije, a zapravo se ponaša različito, ovisno o operativnom sustavu.

Sljedeći fragment koda prikazuje dvije niti s istim prioritetom koje daju nakon svakog rasporeda:

javna klasa ThreadYield {javna statička void main (String [] args) {Runnable r = () -> {int counter = 0; while (counter <2) {System.out.println (Thread.currentThread () .getName ()); brojač ++; Thread.yield (); }}; nova nit (r) .start (); nova nit (r) .start (); }}

Kad više puta pokušamo pokrenuti gornji program, dobivamo različite rezultate; neki od njih su spomenuti u nastavku:

Pokreni 1:

Tema-0 Tema-1 Tema-1 Tema-0

Pokreni 2:

Tema-0 Tema-0 Tema-1 Tema-1

Kao što vidite ponašanje korisnika prinos() je nedeterminističan i ovisan o platformi.

3. Usporedba s drugim idiomima

Postoje i drugi konstrukti koji utječu na relativno napredovanje niti. Oni uključuju čekati(), obavijestiti() i notifyAll () kao dio Objekt razred, pridružiti() kao dio Nit razred, i spavati() kao dio Nit razred.

Pogledajmo kako se uspoređuju sa prinos().

3.1. prinos() nasuprot čekati()

  • Dok prinos() poziva se u kontekstu trenutne niti, čekati() može se pozvati samo na izričito stečenoj bravi unutar sinkroniziranog bloka ili metode
  • Za razliku od prinos(), moguće je čekati() da odredite minimalno vremensko razdoblje koje treba pričekati prije bilo kakvog pokušaja ponovnog rasporeda niti
  • S čekati() nit je također moguće probuditi u bilo kojem trenutku putem poziva obavijestiti() ili notifyAll () na predmetnom zaključanom predmetu

3.2. prinos() nasuprot spavati()

  • Dok prinos() može samo heuristički pokušati zaustaviti izvršavanje trenutne niti bez jamstva kada će se zakazati natrag, spavati() može prisiliti planera da zaustavi izvršavanje trenutne niti barem spomenuto vremensko razdoblje kao svoj parametar.

3.3. prinos() nasuprot pridružiti()

  • Trenutna nit se može pozvati pridružiti() na bilo kojoj drugoj niti koja tjera trenutnu nit da pričeka da druga nit umre prije nego što nastavite
  • Po želji može kao svoj parametar spomenuti vremensko razdoblje koje pokazuje maksimalno vrijeme tijekom kojeg bi trenutna nit trebala pričekati prije nastavka

4. Upotreba za prinos()

Kao što službena dokumentacija sugerira, rijetko je potrebno koristiti prinos() i stoga ga treba izbjegavati, osim ako je vrlo jasno s ciljevima u svjetlu njegovog ponašanja.

Bez obzira na to, neke od njih koriste za prinos() uključuju dizajniranje konstrukcija za kontrolu paralelnosti, poboljšanje odziva sustava u računalno teškom programu itd.

Međutim, ove upotrebe moraju biti popraćene detaljnim profiliranjem i uspoređivanjem kako bi se osigurao željeni ishod.

5. Zaključak

U ovom kratkom članku razgovarali smo o prinos() metoda u Nit razreda i vidio njegovo ponašanje i ograničenja kroz fragment koda.

Također smo istražili njegovu usporedbu s drugim idiomima istodobnosti dostupnim na Javi i na kraju pogledali neke od slučajeva upotrebe prinos() moglo biti korisno.

Kao i uvijek, primjere iz ovog članka možete pogledati na GitHubu.