"Hai, Amigo!"
"Hai, Rishi!"
"Saya akan memperkenalkan Anda pada metode wait , notify , dan notifyAll dari kelas Object ."
"Hari ini kita hanya akan berkenalan dengan mereka, tetapi kita akan kembali lagi nanti dan menghabiskan lebih banyak waktu untuk ini."
"Oke."
"Metode ini ditemukan sebagai bagian dari mekanisme sinkronisasi utas."
"Izinkan saya mengingatkan Anda bahwa Java memiliki mekanisme bawaan untuk mengontrol akses ke sumber daya bersama (objek) dari utas yang berbeda. Sebuah utas dapat menyatakan bahwa suatu objek sedang sibuk, dan utas lainnya harus menunggu hingga objek yang sibuk dilepaskan. "
"Aku ingat. Kamu melakukannya dengan menggunakan kata kunci tersinkronisasi ."
"Benar. Biasanya, kodenya akan terlihat seperti ini:"
public void print()
{
Object monitor = getMonitor();
synchronized(monitor)
{
System.out.println("text");
}
}
"Ingat cara kerjanya?"
"Ya. Jika dua utas secara bersamaan memanggil metode print(), salah satunya akan memasuki blok berlabel disinkronkan dan mengunci monitor, sehingga utas kedua akan menunggu hingga monitor dilepaskan."
"Benar. Begitu utas memasuki blok berlabel disinkronkan, objek monitor ditandai sebagai sibuk, dan utas lainnya akan dipaksa menunggu objek monitor dilepaskan. Objek monitor yang sama dapat digunakan di berbagai bagian program. "
"Ngomong-ngomong, kenapa kamu memilih nama monitor?"
"Monitor adalah apa yang biasanya Anda sebut objek yang menyimpan status sibuk atau bebas."
"Dan di sinilah metode tunggu dan beri tahu berperan."
"Sebenarnya, hanya ada dua metode ini. Yang lain hanyalah adaptasi dari metode ini."
"Sekarang mari kita pahami apa itu metode menunggu dan mengapa kita membutuhkannya. "
"Terkadang ada situasi dalam program di mana utas memasukkan blok kode yang disinkronkan dan mengunci monitor, tetapi tidak dapat melanjutkan karena kehilangan beberapa data. Misalnya, file yang perlu diproses belum selesai diunduh atau sesuatu seperti itu."
"Kita bisa menunggu file untuk diunduh. Anda bisa memeriksanya menggunakan loop. Jika file belum diunduh, tidurlah sebentar, dan periksa lagi sampai diunduh."
"Sesuatu seperti ini:"
while(!file.isDownloaded())
{
Thread.sleep(1000);
}
processFile(file);
"Namun dalam kasus kami, jenis penantian seperti ini terlalu mahal. Karena utas kami mengunci monitor, utas lainnya juga terpaksa menunggu meskipun mereka mungkin sudah memiliki data yang mereka butuhkan."
" Metode wait() ditemukan untuk mengatasi masalah ini. Metode ini menyebabkan utas melepaskan monitor dan kemudian «menangguhkan» utas.
"Anda hanya dapat memanggil metode menunggu objek monitor saat monitor sedang sibuk, yaitu hanya di dalam blok yang disinkronkan . Ketika ini terjadi, utas berhenti berjalan untuk sementara, dan monitor dilepaskan sehingga utas lain dapat menggunakannya."
"Seringkali ada kejadian di mana utas akan memasuki blok yang disinkronkan dan memanggil tunggu, sehingga melepaskan monitor."
"Kemudian utas kedua akan masuk dan ditangguhkan, lalu utas ketiga, dan seterusnya."
"Dan bagaimana utas dilanjutkan?"
"Untuk itu, ada metode kedua: beri tahu."
"Anda hanya dapat memanggil metode notify / notifyAll objek monitor ketika monitor sibuk, yaitu hanya di dalam blok yang disinkronkan . Metode notifyAll membangunkan semua utas yang menunggu di objek monitor ini."
" Metode beri tahu 'membatalkan' satu utas acak, tetapi metode beri tahu Semua membatalkan semua utas «beku» monitor ini."
"Sangat menarik. Terima kasih, Rishi."
"Ada juga adaptasi dari metode wait() :"
menunggu() metode | Penjelasan |
---|---|
|
Utas "membeku", tetapi secara otomatis "membeku" setelah menunggu jumlah milidetik yang diteruskan ke metode sebagai argumen. |
|
Utas «membeku», tetapi secara otomatis «membekukan» setelah menunggu jumlah nanodetik yang diteruskan ke metode sebagai argumen. |
"Kami juga menyebutnya menunggu dengan batas waktu. Metode ini berfungsi seperti menunggu normal, tetapi jika waktu yang ditentukan telah berlalu dan utas belum dibangunkan, ia akan bangun dengan sendirinya."
GO TO FULL VERSION