"Hai, Amigo!"

"Hai, Rishi!"

"Saya akan memperkenalkan anda kepada kaedah wait , notify , dan notifyAll kelas Objek ."

"Hari ini kita hanya akan berkenalan dengan mereka, tetapi kita akan kembali kemudian dan menghabiskan lebih banyak masa untuk perkara ini."

"Baik."

"Kaedah ini dicipta sebagai sebahagian daripada mekanisme penyegerakan benang."

"Izinkan saya mengingatkan anda bahawa Java mempunyai mekanisme terbina dalam untuk mengawal akses kepada sumber yang dikongsi (objek) daripada benang yang berbeza. Benang boleh mengisytiharkan bahawa objek sedang sibuk, dan benang lain perlu menunggu sehingga objek sibuk dikeluarkan. "

"Saya ingat. Anda lakukan itu menggunakan kata kunci yang disegerakkan ."

"Betul. Biasanya, kod akan kelihatan seperti ini:"

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

"Ingat bagaimana ia berfungsi?"

"Ya. Jika dua utas serentak memanggil kaedah print(), salah satu daripadanya akan memasuki blok yang dilabelkan disegerakkan dan mengunci monitor, yang menjadikannya jadi utas kedua akan menunggu sehingga monitor dikeluarkan."

"Betul. Sebaik sahaja benang memasuki blok yang dilabelkan disegerakkan, objek monitor ditandakan sebagai sibuk, dan benang lain akan terpaksa menunggu objek monitor dikeluarkan. Objek monitor yang sama boleh digunakan dalam pelbagai bahagian program. "

"By the way, kenapa awak pilih nama monitor?"

"Monitor ialah apa yang biasanya anda panggil objek yang menyimpan status sibuk atau bebas."

"Dan di sinilah kaedah menunggu dan memberitahu dimainkan."

"Sebenarnya, ini adalah satu-satunya dua kaedah. Yang lain hanyalah penyesuaian kaedah ini."

"Sekarang mari kita fikirkan tentang kaedah menunggu dan mengapa kita memerlukannya. "

"Kadang-kadang terdapat situasi dalam program di mana benang memasuki blok kod disegerakkan dan mengunci monitor, tetapi tidak dapat meneruskan kerana ia kehilangan beberapa data. Contohnya, fail yang perlu diproses belum selesai memuat turun atau sesuatu seperti itu."

"Kami hanya boleh menunggu sehingga fail dimuat turun. Anda hanya boleh menyemaknya menggunakan gelung. Jika fail itu belum dimuat turun lagi, kemudian tidur sebentar atau lebih, dan semak semula sehingga ia dimuat turun."

"Sesuatu seperti ini:"

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

"Tetapi dalam kes kami, jenis menunggu ini terlalu mahal. Memandangkan utas kami mengunci monitor, utas lain juga terpaksa menunggu walaupun mereka mungkin sudah mempunyai data yang mereka perlukan."

" Kaedah wait() dicipta untuk menyelesaikan masalah ini. Kaedah ini menyebabkan benang melepaskan monitor dan kemudian «menggantung» benang.

"Anda hanya boleh memanggil kaedah menunggu objek monitor apabila monitor sibuk, iaitu hanya di dalam blok yang disegerakkan . Apabila ini berlaku, utas akan berhenti berjalan buat sementara waktu, dan monitor dilepaskan supaya utas lain boleh menggunakannya."

"Selalunya terdapat keadaan di mana benang akan memasuki blok yang disegerakkan dan memanggil tunggu, dengan itu melepaskan monitor."

"Kemudian benang kedua akan masuk dan digantung, kemudian yang ketiga, dan seterusnya."

"Dan bagaimanakah benang disambung semula?"

"Untuk itu, terdapat kaedah kedua: maklumkan."

"Anda hanya boleh memanggil kaedah notify / notifyAll objek monitor apabila monitor sibuk, iaitu hanya di dalam blok yang disegerakkan . Kaedah notifyAll membangkitkan semua rangkaian yang sedang menunggu pada objek monitor ini."

" Kaedah pemberitahuan 'menyahbekukan' satu utas rawak, tetapi kaedah notifyAll menyahbekukan semua utas «beku» monitor ini."

"Sangat menarik. Terima kasih, Rishi."

"Terdapat juga penyesuaian kaedah wait() :"

kaedah tunggu(). Penjelasan
void wait(long timeout)
Benang «membeku», tetapi ia secara automatik «menyahbeku» selepas menunggu bilangan milisaat yang dihantar ke kaedah sebagai hujah.
void wait(long timeout, int nanos)
Benang «membeku», tetapi ia secara automatik «menyahbeku» selepas menunggu bilangan nanosaat yang dihantar kepada kaedah sebagai hujah.

"Kami juga memanggil ini menunggu dengan tamat masa. Kaedah ini berfungsi seperti menunggu biasa, tetapi jika masa yang ditentukan telah berlalu dan benang itu belum dibangkitkan, ia akan bangun dengan sendirinya."