"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 |
---|---|
|
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 |
---|---|
|
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 |
---|---|
|
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 |
---|---|
|
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ę.
GO TO FULL VERSION