"Cześć, Amigo!"

„Teraz opowiem ci trochę o metodach snu, wydajności i łączenia”.

„To nudne. Właśnie znalazłem pytanie z wywiadu:„ Jaka jest różnica między metodami yield (), sleep () i wait ()?”. Czy możesz to wyjaśnić?

„Nie ma problemu. Po pierwsze, to są trzy zupełnie różne metody.”

1) sleep(timeout)  – zatrzymuje bieżący wątek (na którym wywołano uśpienie) na liczbę milisekund wskazaną przez parametr timeout. Następnie wątek przechodzi w stan TIMED_WAITING. Metoda może zakończyć się wcześniej, jeśli ustawiona jest flaga isInterrupted.

Przykład Opis
Thread.sleep(500);
Bieżący wątek wstrzymuje swoje własne wykonanie na 500 milisekund, czyli 0,5 sekundy.

2) yield()  – bieżący wątek „przeskakuje swoją kolejkę”. Wątek przechodzi ze stanu uruchomionego do stanu gotowości , a JVM przechodzi do następnego wątku. Stany pracy i gotowości są stanami podrzędnymi stanu RUNNABLE .

Przykład Opis
Thread.yield();
Bieżący wątek „pomija swoją kolejkę” i Java natychmiast przełącza się do następnego wątku.

3) wait(timeout)  – jest to wersja metody wait (), ale z limitem czasu. „ Metodę oczekiwania można wywołać tylko w zsynchronizowanym bloku obiektu mutex zablokowanego przez bieżący wątek. W przeciwnym razie metoda zgłasza wyjątek Illegal MonitorState .

"Wywołanie tej metody powoduje zwolnienie blokady obiektu mutex, udostępniając go innemu wątkowi do pozyskania. Ponadto wątek przechodzi w stan OCZEKIWANIA (dla metody wait() bez parametrów) lub w stan TIMED_WAITING (dla metody wait(timeout ) metoda)."

Przykład Opis
Object monitor = getMonitor();
synchronized(monitor)
{monitor.wait(500);}
Po wywołaniu metody wait bieżący wątek zwalnia blokadę monitorowanego obiektu i przechodzi w stan uśpienia na 500 milisekund. Obiekt monitora może zostać przejęty przez inny wątek.
Po 500 milisekundach wątek się obudzi i jeśli monitor nie jest zajęty, wątek go przejmie i będzie kontynuował pracę.
Jeśli monitor jest zablokowany przez inny wątek, bieżący wątek przełączy się w stan BLOCKED.

4) dołącz (przekroczono limit czasu)

„Tej metody nie było w twoim pytaniu, ale jest w moim planie lekcji, więc opowiem ci o niej. Kiedy wywołujesz metodę join() lub join(timeout), bieżący wątek jest „dołączony” do wątku który wywołał tę metodę. Bieżący wątek przechodzi w stan uśpienia i czeka na zakończenie wątku, do którego jest przyłączony (tj. wątku, którego metoda join() została wywołana)."

„Bieżący wątek wchodzi w stan OCZEKIWANIA dla metody join() i stan TIMED_WAITING dla metody join(timeout)”.

Przykład Opis
Thread thread = getWorkThread();
thread.join(500);
Bieżący wątek dołączy do wątku workerThread i zaczeka na jego zakończenie.
Ale „odłączy się” po 500 milisekundach i będzie działać dalej.

„Przekroczenie czasu w metodach wait(timeout) i join(timeout) oznacza, że ​​metoda przechodzi w stan uśpienia i czeka na coś, ale nie dłużej niż limit czasu podany w milisekundach. Następnie budzi się”.

„Wygląda na to, że jedyną wspólną cechą tych metod jest przekroczenie limitu czasu. Robią zupełnie inne rzeczy”.

— Tak, zgadza się.