-
Ano ang lahat ng mga estado ng bagay
Thread
?- BAGO
- NAKATAKBO
- NA-block
- NAGHIHINTAY
- TIMED_WAITING
- WINAWASAN
-
Anong mga estado ang maaaring mapuntahan ng isang thread kapag pumapasok sa isang bloke
synchronized
?- NAKATAKBO
- NA-block
Sa RUNNABLE, kung ang bloke ng code na minarkahan
synchronized
ay hindi inookupahan ng isa pang thread. Kung hindi, ang aming thread ay makakatanggap ng BLOCKED na estado at maghihintay para sa mutex object na ilabas. - Anong estado ang pupuntahan ng thread kapag tumatawag sa pamamaraan
wait()
?Ang pagtawag sa paraang ito ay naglalagay ng thread sa WAITING state.
Ang pamamaraanwait()
ay maaari lamang tawagan sa loob ng isang blokesynchronized
sa isang mutex na bagay na "naka-lock" ng kasalukuyang thread, kung hindi, ang pamamaraan ay magtapon ng isang IllegalMonitorStateException exception .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Kapag tinawag ang isang paraanwait()
, ang kasalukuyang thread ay naglalabas ng lock mula sa bagaymonitor
at pumapasok sa WAITING state, naghihintay para sa pamamaraan na tawaginmonitor.notify()
ngmonitor.notifyAll()
isa pang thread. Sa sandaling mangyari ito, magigising ang thread at kung hindi abala ang monitor, kukunin ito at patuloy na gumagana.
Kung ang monitor ay inookupahan ng isa pang thread, ang kasalukuyang thread ay mapupunta sa BLOCKED na estado. -
Anong estado ang pupuntahan ng thread kapag tumatawag sa pamamaraan
Ang pagtawag sa paraang ito ay naglalagay ng thread sa TIMED_WAITING na estado.wait(500)
?
Sa pamamagitan ng pagkakatulad sa pamamaraanwait()
,wait(timeout)
maaari lamang itong tawagan sa loob ng isang blokesynchronized
sa isang bagay na mutex na "naka-lock (naka-lock)" ng kasalukuyang thread.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Kapag tinatawagan ang paraan
wait()
, inilalabas ng kasalukuyang thread ang lock mula sa bagaymonitor
at matutulog nang 500 millisecond. Ang bagaymonitor
ay maaaring makuha ng isa pang thread.
Pagkatapos ng 500 milliseconds, magigising ang thread at kungmonitor
hindi ito abala, kukunin ito at magpapatuloy sa pagtatrabaho.
Kung ang monitor ay inookupahan ng isa pang thread, ang kasalukuyang thread ay mapupunta sa BLOCKED na estado.Anong estado ang pupuntahan ng thread kapag tumatawag sa pamamaraan
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Pagkatapos ngmonitor.wait()
, mapupunta ang thread sa WAITING state. Ang isang pamamaraannotify()
na tinatawag ng isa pang thread sa isang bagaymonitor
ay maglilipat ng thread mula sa WAITING na estado patungo sa RUNNABLE na estado maliban kung ang monitor object ay nakuha ng isa pang thread, kung hindi ay sa BLOCKED na estado. -
Anong estado ang pupuntahan ng thread kapag tumatawag sa pamamaraan
notifyAll()
?notifyAll()
"ay mananatili" sa lahat ng mga thread. Isa sa lahat ng "natutulog" (NAGHIHINTAY) na mga thread ay mapupunta sa RUNNABLE na estado, papalitan ang monitor ng bagay na ginagamit at ipagpapatuloy ang gawain nito. Ang natitira ay nasa BLOCKED na estado. Sa sandaling ilabas ng unang "nakakagising" na thread ang monitor, na hinihintay ng lahat, ang kapalaran nito ay uulitin ng susunod na thread (isang di-makatwirang thread ay pupunta mula sa BLOCKED na estado patungo sa RUNNABLE na estado). Ito ay magpapatuloy hanggang ang lahat ng "nagising" na mga thread ay umalis sa BLOCKED na estado. -
Tatlong thread sa naka-synchronize na block na tinatawag
Dalawa sa kanila ay mapupunta sa BLOCKED na estado, isa sa RUNNABLE na estadowait()
na mutex object. Sa anong estado mapupunta ang mga thread na ito kung tumawag ang ikaapat na threadnotifyAll()
? -
Paano ito naiiba
Sa kabila ng katotohanan na atjoin(500)
sawait(500)
?join(500)
ililipatwait(500)
ang kasalukuyang thread sa TIMED_WAITING na estado, may mga makabuluhang pagkakaiba sa pagitan nila:join(500)
tinatawag sa isang thread,wait(500)
na tinatawag sa loob ng isang naka-synchronize na bloke sa bagay kung saan naka-synchronize ang bloke na ito.
Kapag tinawag,join(500)
ang kasalukuyang thread ay maghihintay ng 500 millisecond para sa thread na ang pamamaraanjoin()
ay tinawag upang makumpleto.
Kapag tinawag,wait(500)
ilalabas ng kasalukuyang thread ang lock mula sa naka-synchronize na bagay at matutulog nang 500 millisecond.
Pagkatapos ng 500 millisecond, sa parehong mga kaso ay patuloy na gagana ang mga thread. -
Paano ito naiiba
wait(500)
sasleep(500)
?sleep(500)
tinatawag sa isang thread,wait(500)
na tinatawag sa loob ng isang naka-synchronize na bloke sa bagay kung saan naka-synchronize ang bloke na ito.
Kapag tinawag,sleep(500)
ang kasalukuyang thread ay maghihintay ng 500 millisecond, pagkatapos ay ipagpapatuloy ang trabaho nito.
Kapag tinawag,wait(500)
ilalabas ng kasalukuyang thread ang lock mula sa naka-synchronize na bagay at matutulog nang 500 millisecond. -
Anong estado ang pupuntahan ng thread kapag tumatawag sa pamamaraan
Kapag tinawag ang isang paraanyield()
?yield()
, ang kasalukuyang thread ay "lumalaktaw sa kanyang turn" at ang java ay agad na lumipat sa pagpapatupad ng susunod na thread. Ang thread ay napupunta mula sa estadorunning
patungo sa estadoready
. Ang tumatakbo at handa na estado ay mga substate ng RUNNABLE na estado.
GO TO FULL VERSION