"Bună, Amigo!"

„Acum o să vă povestesc puțin despre metodele de somn, cedare și unire”.

"Este plictisitor. Tocmai am găsit o întrebare de interviu: „Care este diferența dintre metodele de randament (), somn () și așteptare ()?'. Poți explica asta?"

"Nici o problemă. În primul rând, acestea sunt trei metode complet diferite."

1) sleep(timeout)  – oprește firul curent (pe care a fost apelat sleep) pentru numărul de milisecunde indicat de parametrul timeout. Firul trece apoi în starea TIMED_WAITING. Metoda se poate termina mai devreme dacă este setat indicatorul isInterrupted.

Exemplu Descriere
Thread.sleep(500);
Firul curent își suspendă propria execuție timp de 500 de milisecunde sau 0,5 secunde.

2) yield()  – firul curent „își sare rândul”. Firul de execuție trece de la starea de rulare la starea de pregătire , iar JVM-ul trece la următorul thread. Stările de rulare și gata sunt substări ale stării RUNABLE .

Exemplu Descriere
Thread.yield();
Firul curent „își sare rândul” și Java trece imediat la următorul thread.

3) wait(timeout)  – aceasta este o versiune a metodei wait (), dar cu un timeout. „ Metoda wait poate fi apelată numai într-un bloc sincronizat pe un obiect mutex blocat de firul curent. În caz contrar, metoda aruncă o excepție MonitorState ilegală.

„Apelarea acestei metode face ca blocarea obiectului mutex să fie eliberată, făcându-l disponibil pentru achiziționarea unui alt fir. În plus, firul de execuție intră în starea AȘTEPTARE (pentru metoda wait() fără parametri) sau în starea TIMED_WAITING (pentru așteptarea (timeout). ) metoda)."

Exemplu Descriere
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Când este apelată metoda de așteptare, firul de execuție curent eliberează blocarea obiectului monitor și inactivează timp de 500 de milisecunde. Obiectul monitor poate fi achiziționat de un alt fir.
După 500 de milisecunde, firul se va trezi și dacă monitorul nu este ocupat, firul îl va achiziționa și va continua să funcționeze.
Dacă monitorul este blocat de un alt fir, firul curent va trece în starea BLOCKAT.

4) alăturați-vă (timeout)

„Această metodă nu a fost în întrebarea dvs., dar este în planul meu de lecție, așa că vă voi spune despre asta. Când apelați metoda join() sau join(timeout), firul curent este „atașat” la Thread care a numit această metodă. Firul curent intră în repaus și așteaptă până când firul la care este conectat se termină (adică firul a cărui metodă join() a fost apelată)."

„Firul curent intră în starea AȘTEPTARE pentru metoda join() și în starea TIMED_WAITING pentru metoda join(timeout).

Exemplu Descriere
Thread thread = getWorkThread();
thread.join(500);
Firul curent se va alătura firului workerThread și se va aștepta să se termine.
Dar se va „deconecta” după 500 de milisecunde și va continua să ruleze.

„Timpul de expirare din metodele wait(timeout) și join(timeout) înseamnă că metoda intră în somn și așteaptă ceva, dar nu mai mult decât timeout-ul dat în milisecunde. Apoi se trezește.”

„Se pare că singurul lucru pe care aceste metode îl au în comun este timeout. Ele fac lucruri complet diferite”.

— Da, așa este.