-
Jakie są wszystkie stany obiektu
Thread
?- NOWY
- URUCHOMIONE
- ZABLOKOWANY
- CZEKANIE
- TIMED_WAITING
- ZAKOŃCZONY
-
Do jakich stanów może przejść wątek po wejściu do bloku
synchronized
?- URUCHOMIONE
- ZABLOKOWANY
W RUNNABLE, jeśli zaznaczony blok kodu
synchronized
nie jest zajęty przez inny wątek. W przeciwnym razie nasz wątek otrzyma stan ZABLOKOWANY i będzie czekał na zwolnienie obiektu mutex. - Do jakiego stanu przejdzie wątek podczas wywoływania metody
wait()
?Wywołanie tej metody umieszcza wątek w stanie WAITING.
Metodęwait()
można wywołać tylko wewnątrz blokusynchronized
obiektu mutex, który został „zablokowany” przez bieżący wątek, w przeciwnym razie metoda zgłosi wyjątek IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Po wywołaniu metody bieżącywait()
wątek zwalnia blokadę obiektumonitor
i przechodzi w stan OCZEKIWANIA, oczekując na wywołanie metodymonitor.notify()
przezmonitor.notifyAll()
inny wątek. Gdy tylko to nastąpi wątek się obudzi i jeśli monitor nie będzie zajęty to go przechwyci i będzie kontynuował pracę.
Jeśli monitor jest zajęty przez inny wątek, bieżący wątek przejdzie w stan ZABLOKOWANY. -
Do jakiego stanu przejdzie wątek podczas wywoływania metody
Wywołanie tej metody umieszcza wątek w stanie TIMED_WAITING.wait(500)
?
Analogicznie do metodywait()
,wait(timeout)
można ją wywołać tylko wewnątrz blokusynchronized
obiektu mutex, który został „zablokowany (zablokowany)” przez bieżący wątek.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Podczas wywoływania metody
wait()
bieżący wątek zwalnia blokadę obiektumonitor
i przechodzi w stan uśpienia na 500 milisekund. Obiektmonitor
może zostać przechwycony przez inny wątek.
Po 500 milisekundach wątek się obudzi i jeślimonitor
nie był zajęty, przejmie go i będzie kontynuował pracę.
Jeśli monitor jest zajęty przez inny wątek, bieżący wątek przejdzie w stan ZABLOKOWANY.Do jakiego stanu przejdzie wątek podczas wywoływania metody
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Po tymmonitor.wait()
wątek przejdzie w stan OCZEKIWANIA. Metodanotify()
wywoływana przez inny wątek na obiekciemonitor
przeniesie wątek ze stanu WAITING do stanu RUNNABLE, chyba że obiekt monitorowany zostanie przechwycony przez inny wątek, w przeciwnym razie do stanu BLOCKED. -
Do jakiego stanu przejdzie wątek podczas wywoływania metody
notifyAll()
?notifyAll()
„pozostaną” wszystkie wątki. Jeden ze wszystkich wątków „uśpionych” (WAITING) przejdzie w stan RUNNABLE, przejmie monitorowanie używanego obiektu i będzie kontynuował jego pracę. Reszta będzie w stanie ZABLOKOWANYM. Gdy tylko pierwszy „budzący się” wątek zwolni monitor, na który wszyscy czekają, jego los powtórzy się w kolejnym wątku (dowolny wątek przejdzie ze stanu ZABLOKOWANY do stanu RUNNABLE). Będzie to trwało, dopóki wszystkie „przebudzone” wątki nie opuszczą stanu ZABLOKOWANEGO. -
Trzy wątki w zsynchronizowanym bloku zwanym
Dwa z nich przejdą w stan ZABLOKOWANY, jeden w stan RUNNABLEwait()
obiektem mutex. Do jakiego stanu przejdą te wątki, jeśli wywołany zostanie czwarty wąteknotifyAll()
? -
Czym to się różni
Pomimo tego, że ijoin(500)
odwait(500)
?join(500)
przeniosąwait(500)
bieżący wątek do stanu TIMED_WAITING, istnieją między nimi istotne różnice:join(500)
wywoływane w wątku,wait(500)
wywoływane wewnątrz synchronizowanego bloku na obiekcie, na którym ten blok jest synchronizowany.
Po wywołaniu bieżący wątek będzie czekał 500 milisekund na zakończeniejoin(500)
wątku, którego metoda została wywołana. Po wywołaniu bieżący wątek zwolni blokadę synchronizowanego obiektu i przejdzie w tryb uśpienia na 500 milisekund. Po 500 milisekundach w obu przypadkach wątki będą nadal działać.join()
wait(500)
-
Czym to się różni
wait(500)
odsleep(500)
?sleep(500)
wywoływane w wątku,wait(500)
wywoływane wewnątrz zsynchronizowanego bloku w obiekcie, z którym ten blok jest synchronizowany.
Po wywołaniusleep(500)
bieżący wątek odczeka 500 milisekund, a następnie będzie kontynuował swoją pracę.
Po wywołaniu bieżącywait(500)
wątek zwolni blokadę synchronizowanego obiektu i przejdzie w stan uśpienia na 500 milisekund. -
Do jakiego stanu przejdzie wątek podczas wywoływania metody
Kiedy wywoływana jest metodayield()
?yield()
, bieżący wątek „pomija swoją kolej”, a Java natychmiast przechodzi do wykonywania następnego wątku. Wątek przechodzi od stanurunning
do stanuready
. Stany pracy i gotowości są stanami podrzędnymi stanu RUNNABLE.
GO TO FULL VERSION