-
Apakah semua keadaan objek
Thread
?- BARU
- BOLEH LARI
- TERSEKAT
- MENUNGGU
- TIMED_WAITING
- DITAMATKAN
-
Apakah keadaan yang boleh dilalui oleh benang apabila memasuki blok
synchronized
?- BOLEH LARI
- TERSEKAT
Dalam RUNNABLE, jika blok kod yang ditanda
synchronized
tidak diduduki oleh benang lain. Jika tidak, benang kami akan menerima keadaan DISEKAT dan akan menunggu objek mutex dikeluarkan. - Keadaan apakah yang akan dituju oleh benang apabila memanggil kaedah
wait()
?Memanggil kaedah ini meletakkan benang dalam keadaan MENUNGGU.
Kaedah iniwait()
hanya boleh dipanggil di dalam bloksynchronized
pada objek mutex yang telah "dikunci" oleh benang semasa, jika tidak kaedah itu akan membuang pengecualian IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Apabila kaedah dipanggilwait()
, benang semasa melepaskan kunci dari objekmonitor
dan memasuki keadaan MENUNGGU, menunggu kaedah dipanggilmonitor.notify()
olehmonitor.notifyAll()
benang lain. Sebaik sahaja ini berlaku, benang akan terjaga dan jika monitor tidak sibuk, ia akan mengambilnya dan terus bekerja.
Jika monitor diduduki oleh utas lain, utas semasa akan masuk ke dalam keadaan DISEKAT. -
Keadaan apakah yang akan dituju oleh benang apabila memanggil kaedah
Memanggil kaedah ini meletakkan urutan dalam keadaan TIMED_WAITING.wait(500)
?
Dengan analogi dengan kaedahwait()
,wait(timeout)
ia hanya boleh dipanggil di dalam bloksynchronized
pada objek mutex yang telah "dikunci (dikunci)" oleh benang semasa.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Apabila memanggil kaedah
wait()
, benang semasa melepaskan kunci daripada objekmonitor
dan tidur selama 500 milisaat. Objekmonitor
mungkin ditangkap oleh benang lain.
Selepas 500 milisaat, benang akan bangun dan jikamonitor
ia tidak sibuk, ia akan mengambilnya dan terus bekerja.
Jika monitor diduduki oleh utas lain, utas semasa akan masuk ke dalam keadaan DISEKAT.Keadaan apakah yang akan dituju oleh benang apabila memanggil kaedah
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Selepasmonitor.wait()
, benang akan masuk ke keadaan MENUNGGU. Kaedahnotify()
yang dipanggil oleh utas lain pada objekmonitor
akan mengalihkan utas dari keadaan MENUNGGU kepada keadaan RUNNABLE melainkan objek monitor ditangkap oleh utas lain, sebaliknya kepada keadaan DISEKAT. -
Keadaan apakah yang akan dituju oleh benang apabila memanggil kaedah
notifyAll()
?notifyAll()
"akan kekal" semua benang. Salah satu daripada semua utas "tidur" (MENUNGGU) akan masuk ke keadaan RUNNABLE, mengambil alih monitor objek yang digunakan dan meneruskan kerjanya. Selebihnya akan berada dalam keadaan TERSEKAT. Sebaik sahaja benang "bangun" pertama mengeluarkan monitor, yang ditunggu-tunggu oleh semua orang, nasibnya akan diulangi oleh utas seterusnya (benang sewenang-wenangnya akan pergi dari keadaan DISEKAT kepada keadaan RUNNABLE). Ini akan berterusan sehingga semua rangkaian "terjaga" meninggalkan keadaan DISEKAT. -
Tiga utas dalam blok disegerakkan dipanggil
Dua daripadanya akan masuk ke dalam keadaan TERSEKAT, satu ke dalam keadaan RUNNABLEwait()
objek mutex. Apakah keadaan benang ini jika urutan keempat dipanggilnotifyAll()
? -
Bagaimana ia berbeza
Walaupun fakta bahawa danjoin(500)
daripadawait(500)
?join(500)
akanwait(500)
memindahkan benang semasa ke keadaan TIMED_WAITING, terdapat perbezaan yang ketara antara mereka:join(500)
dipanggil pada benang,wait(500)
dipanggil di dalam blok disegerakkan pada objek yang blok ini disegerakkan.
Apabila dipanggil,join(500)
utas semasa akan menunggu 500 milisaat untuk utas yang kaedahnyajoin()
dipanggil untuk dilengkapkan.
Apabila dipanggil,wait(500)
benang semasa akan melepaskan kunci daripada objek yang disegerakkan dan tidur selama 500 milisaat.
Selepas 500 milisaat, dalam kedua-dua kes, benang akan terus berfungsi. -
Bagaimana ia berbeza
wait(500)
daripadasleep(500)
?sleep(500)
dipanggil pada benang,wait(500)
dipanggil di dalam blok disegerakkan pada objek yang blok ini disegerakkan.
Apabila dipanggil,sleep(500)
urutan semasa akan menunggu 500 milisaat, kemudian meneruskan kerjanya.
Apabila dipanggil,wait(500)
benang semasa akan melepaskan kunci daripada objek yang disegerakkan dan tidur selama 500 milisaat. -
Keadaan apakah yang akan dituju oleh benang apabila memanggil kaedah
Apabila kaedah dipanggilyield()
?yield()
, utas semasa "melangkau gilirannya" dan java segera beralih kepada melaksanakan utas seterusnya. Benang pergi dari negerirunning
ke negeriready
. Keadaan berjalan & sedia adalah substate bagi keadaan RUNNABLE.
GO TO FULL VERSION