Apa perbedaan antara status thread WAIT dan status thread BLOCKED?
The Thread.State dokumentasi :
Diblokir
Utas yang diblokir menunggu kunci monitor berada dalam status ini.Menunggu
Sebuah thread yang menunggu tanpa batas waktu thread lain untuk melakukan tindakan tertentu berada dalam status ini
tidak menjelaskan perbedaannya kepada saya.
java
multithreading
block
wait
Lebih dari Lima
sumber
sumber
Jawaban:
Sebuah utas akan menunggu status setelah memanggil
wait()
Objek. Ini disebut Status Menunggu . Setelah utas mencapai status menunggu, utas harus menunggu hingga utas lain memanggilnotify()
ataunotifyAll()
pada objek.Setelah utas ini diberi tahu, utas tidak akan dapat dijalankan. Bisa jadi utas lain juga diberitahukan (menggunakan
notifyAll()
) atau utas pertama belum menyelesaikan pekerjaannya, sehingga masih diblokir sampai mendapat kesempatan. Ini disebut Status Diblokir . Keadaan diblokir akan terjadi setiap kali utas mencoba untuk mendapatkan kunci pada objek dan beberapa utas lain sudah menahan kunci.Setelah utas lain keluar dan utas ini berpeluang, utas tersebut pindah ke status Runnable setelah itu memenuhi syarat pekerjaan pengambilan berdasarkan mekanisme threading JVM dan pindah ke status berjalan.
sumber
Perbedaannya relatif sederhana.
Dalam
BLOCKED
status, utas akan memasukisynchronized
blok, tetapi ada utas lain yang sedang berjalan di dalamsynchronized
blok pada objek yang sama. Utas pertama kemudian harus menunggu utas kedua keluar dari bloknya.Dalam
WAITING
status, utas sedang menunggu sinyal dari utas lain. Ini biasanya terjadi dengan meneleponObject.wait()
, atauThread.join()
. Utas kemudian akan tetap dalam keadaan ini sampai utas lain memanggilObject.notify()
, atau mati.sumber
Object.wait()
secara langsung, tetapi Anda berakhir diWAITING
status tersebut juga menggunakan konstruksi konkurensi tingkat tinggi - seperti kunci, antrean pemblokiran, dll ... secara umum, setiap kali dua utas harus berkoordinasi.RUNNING
status.Thread.State
mengatakan, "... Status ini adalah status mesin virtual yang tidak mencerminkan status thread sistem operasi apa pun." Dengan kata lain, JVM tidak peduli tentang perbedaan antara utas yang menjalankan kode Java, utas yang menunggu panggilan sistem untuk kembali, atau utas yang menunggu potongan waktu. Itu semua hanyaRUNNABLE
sejauh menyangkut JVM.WAITING
status, utas harus terlebih dahulu masuk keBLOCKED
status hingga dapat memperoleh kunci yang terkait dengan objek yang ditunggunya.Perbedaan penting antara status diblokir dan menunggu adalah dampaknya pada penjadwal. Sebuah utas dalam keadaan diblokir bersaing untuk mendapatkan kunci; utas itu masih dihitung sebagai sesuatu yang perlu diservis oleh penjadwal, mungkin diperhitungkan dalam keputusan penjadwal tentang berapa banyak waktu untuk memberikan utas yang berjalan (sehingga dapat memberi kesempatan utas memblokir pada kunci).
Setelah utas berada dalam status tunggu, tekanan yang diberikan pada sistem diminimalkan, dan penjadwal tidak perlu mengkhawatirkannya. Ini tidak aktif sampai menerima pemberitahuan. Kecuali fakta bahwa itu membuat utas OS terisi, itu sepenuhnya keluar dari permainan.
Inilah sebabnya mengapa menggunakan notifyAll kurang dari ideal, itu menyebabkan sekelompok utas yang sebelumnya dengan senang hati tidak aktif sehingga tidak membebani sistem menjadi terbangun, di mana kebanyakan dari mereka akan memblokir sampai mereka dapat memperoleh kunci, menemukan kondisinya. menunggu tidak benar, dan kembali menunggu. Akan lebih baik jika memberi tahu hanya utas yang memiliki peluang untuk membuat kemajuan.
(Menggunakan ReentrantLock alih-alih kunci intrinsik memungkinkan Anda memiliki beberapa ketentuan untuk satu kunci, sehingga Anda dapat memastikan utas yang diberi tahu adalah utas yang menunggu pada kondisi tertentu, menghindari bug pemberitahuan hilang jika utas mendapat pemberitahuan untuk sesuatu yang tidak bisa ditindaklanjuti.)
sumber
Perspektif yang disederhanakan untuk menafsirkan thread dump:
sumber
RUNNABLE
kurang tepat. Ini bisa berada dalam antrian run Java tetapi tidak mengeksekusi atau bisa juga menjalankan kode Java. Itu tidak harus memanggil ke tanah air.Diblokir- Utas Anda dalam keadaan siklus hidup utas yang dapat dijalankan dan mencoba mendapatkan kunci objek. Tunggu- Utas Anda dalam keadaan menunggu siklus hidup utas dan menunggu sinyal pemberitahuan datang dalam keadaan utas yang dapat dijalankan.
sumber
lihat contoh ini:
demonstrasi status utas.
sumber