"Merhaba, Amigo!"

"Merhaba Rişi!"

"Size Object sınıfının wait , notify ve notifyAll yöntemlerini tanıtacağım ."

"Bugün onlarla sadece tanışacağız, ancak daha sonra geri gelip buna daha fazla zaman ayıracağız."

"Tamam aşkım."

"Bu yöntemler, iş parçacığı senkronizasyon mekanizmasının bir parçası olarak icat edildi."

"Java'nın, farklı ileti dizilerinden paylaşılan kaynaklara (nesnelere) erişimi kontrol etmek için yerleşik bir mekanizması olduğunu hatırlatmama izin verin. Bir ileti dizisi, bir nesnenin meşgul olduğunu bildirebilir ve diğer ileti dizilerinin, meşgul nesne serbest bırakılana kadar beklemesi gerekir. "

"Hatırlıyorum. Bunu senkronize anahtar kelimeyi kullanarak yapıyorsun ."

"Doğru. Tipik olarak, kod şuna benzer:"

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

"Nasıl çalıştığını hatırlıyor musun?"

"Evet. İki iş parçacığı aynı anda print() yöntemini çağırırsa, bunlardan biri senkronize etiketli bloğa girecek ve monitörü kilitleyecek, böylece ikinci iş parçacığı monitör serbest bırakılana kadar bekleyecek."

"Doğru. Bir iş parçacığı senkronize etiketli bloğa girdiğinde, izleme nesnesi meşgul olarak işaretlenir ve diğer iş parçacıkları izleme nesnesinin serbest bırakılmasını beklemeye zorlanır. Aynı izleme nesnesi programın çeşitli bölümlerinde kullanılabilir. "

"Bu arada, neden isim monitörünü seçtin?"

"Bir monitör, genellikle meşgul veya serbest durumunu saklayan bir nesnedir."

"İşte burada bekle ve bildir yöntemleri devreye giriyor."

"Aslında bunlar gerçekten sadece iki yöntem. Diğerleri sadece bu yöntemlerin uyarlamaları."

"Şimdi bekleme yönteminin ne olduğunu ve ona neden ihtiyaç duyduğumuzu anlayalım . "

"Bazen bir programda, bir iş parçacığının bir senkronize kod bloğuna girip monitörü kilitlediği, ancak bazı veriler eksik olduğu için devam edemediği durumlar olabilir. Örneğin, işlemesi gereken bir dosyanın indirilmesi bitmemiş veya bunun gibi bir şey."

"Dosyanın indirilmesini bekleyebiliriz. Bir döngü kullanarak kontrol edebilirsiniz. Dosya henüz indirilmemişse, bir saniye kadar uyuyun ve indirilene kadar tekrar kontrol edin."

"Bunun gibi bir şey:"

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

"Ama bizim durumumuzda, bu tür bir bekleme çok pahalı. Bizim ileti dizimiz monitörü kilitlediğinden, diğer ileti dizileri de ihtiyaç duydukları verilere zaten sahip olsalar bile beklemek zorunda kalıyor."

" Wait() yöntemi bu sorunu çözmek için icat edildi. Bu yöntem, iş parçacığının monitörü serbest bırakmasına ve ardından iş parçacığını «askıya almasına» neden olur.

"Bir monitör nesnesinin bekleme yöntemini yalnızca monitör meşgulken, yani yalnızca senkronize bir blok içindeyken çağırabilirsiniz. Bu olduğunda, iş parçacığı geçici olarak çalışmayı durdurur ve diğer iş parçacıklarının onu kullanabilmesi için monitör serbest bırakılır."

"Genellikle bir iş parçacığının senkronize bir bloğa girip çağrı beklemeye gireceği ve böylece monitörün serbest bırakılacağı durumlar vardır ."

"Sonra ikinci bir iş parçacığı girecek ve askıya alınacak, ardından üçüncü bir iş parçacığı vb.

"Ve bir iş parçacığı nasıl devam ettirilir?"

"Bunun için ikinci bir yöntem var: bildir."

"Bir monitör nesnesinin notify / notifyAll yöntemlerini yalnızca monitör meşgulken, yani yalnızca senkronize bir blok içinde çağırabilirsiniz . NotifyAll yöntemi, bu izleme nesnesinde bekleyen tüm iş parçacıklarını uyandırır."

" Notify yöntemi rastgele bir iş parçacığını 'çözer', ancak notifyAll yöntemi bu monitörün tüm «donmuş» iş parçacıklarını çözer."

"Çok ilginç. Teşekkürler, Rishi."

"Wait() yönteminin uyarlamaları da var:"

bekle() yöntemi Açıklama
void wait(long timeout)
İş parçacığı "donar", ancak yönteme bağımsız değişken olarak iletilen milisaniye sayısını bekledikten sonra otomatik olarak "çözülür".
void wait(long timeout, int nanos)
İş parçacığı "donar", ancak yönteme bağımsız değişken olarak iletilen nanosaniye sayısını bekledikten sonra otomatik olarak "çözülür".

"Biz buna zaman aşımı olan bir bekleme de diyoruz. Yöntem normal bir bekleme gibi çalışıyor ancak belirtilen süre geçtiyse ve iş parçacığı uyanmadıysa kendi kendine uyanıyor."