JavaRush /Blog Java /Random-PL /Poziom 25. Odpowiedzi na pytania podczas rozmowy kwalifik...
zor07
Poziom 31
Санкт-Петербург

Poziom 25. Odpowiedzi na pytania podczas rozmowy kwalifikacyjnej na temat poziomu

Opublikowano w grupie Random-PL
Poziom 25. Odpowiedzi na pytania z rozmowy kwalifikacyjnej na temat poziomu - 1
  1. Jakie są wszystkie stany obiektu Thread?

    • NOWY
    • URUCHOMIONE
    • ZABLOKOWANY
    • CZEKANIE
    • TIMED_WAITING
    • ZAKOŃCZONY
  2. Do jakich stanów może przejść wątek po wejściu do bloku synchronized?

    • URUCHOMIONE
    • ZABLOKOWANY

    W RUNNABLE, jeśli zaznaczony blok kodu synchronizednie jest zajęty przez inny wątek. W przeciwnym razie nasz wątek otrzyma stan ZABLOKOWANY i będzie czekał na zwolnienie obiektu mutex.

  3. 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 bloku synchronizedobiektu 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żący wait()wątek zwalnia blokadę obiektu monitori przechodzi w stan OCZEKIWANIA, oczekując na wywołanie metody monitor.notify()przez monitor.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.

  4. Do jakiego stanu przejdzie wątek podczas wywoływania metody wait(500)?

    Wywołanie tej metody umieszcza wątek w stanie TIMED_WAITING.
    Analogicznie do metody wait(), wait(timeout)można ją wywołać tylko wewnątrz bloku synchronizedobiektu 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ę obiektu monitori przechodzi w stan uśpienia na 500 milisekund. Obiekt monitormoże zostać przechwycony przez inny wątek.
    Po 500 milisekundach wątek się obudzi i jeśli monitornie 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 tym monitor.wait()wątek przejdzie w stan OCZEKIWANIA. Metoda notify()wywoływana przez inny wątek na obiekcie monitorprzeniesie wątek ze stanu WAITING do stanu RUNNABLE, chyba że obiekt monitorowany zostanie przechwycony przez inny wątek, w przeciwnym razie do stanu BLOCKED.

  5. 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.

  6. Trzy wątki w zsynchronizowanym bloku zwanym wait()obiektem mutex. Do jakiego stanu przejdą te wątki, jeśli wywołany zostanie czwarty wątek notifyAll()?

    Dwa z nich przejdą w stan ZABLOKOWANY, jeden w stan RUNNABLE

  7. Czym to się różni join(500)od wait(500)?

    Pomimo tego, że i 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ńczenie join(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)

  8. Czym to się różni wait(500)od sleep(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łaniu sleep(500)bieżący wątek odczeka 500 milisekund, a następnie będzie kontynuował swoją pracę.
    Po wywołaniu bieżący wait(500)wątek zwolni blokadę synchronizowanego obiektu i przejdzie w stan uśpienia na 500 milisekund.

  9. Do jakiego stanu przejdzie wątek podczas wywoływania metody yield()?

    Kiedy wywoływana jest metoda yield(), bieżący wątek „pomija swoją kolej”, a Java natychmiast przechodzi do wykonywania następnego wątku. Wątek przechodzi od stanu runningdo stanu ready. Stany pracy i gotowości są stanami podrzędnymi stanu RUNNABLE.

PS Komentarze, uzupełnienia, poprawki, uwagi są mile widziane =)
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION