"Ciao, Amico!"

"Ciao Rishi!"

"Ti presenterò i metodi wait , notify e notifyAll della classe Object."

"Oggi faremo solo conoscenza con loro, ma torneremo più tardi e dedicheremo più tempo a questo."

"Va bene."

"Questi metodi sono stati inventati come parte del meccanismo di sincronizzazione dei thread."

"Lascia che ti ricordi che Java ha un meccanismo integrato per controllare l'accesso alle risorse condivise (oggetti) da diversi thread. Un thread può dichiarare che un oggetto è occupato e altri thread dovranno attendere fino a quando l'oggetto occupato non viene rilasciato. "

"Ricordo. Lo fai usando la parola chiave sincronizzata ."

"Giusto. In genere, il codice sarebbe simile a questo:"

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

"Ricordi come funziona?"

"Sì. Se due thread chiamano contemporaneamente il metodo print(), uno di loro entrerà nel blocco etichettato sincronizzato e bloccherà il monitor, il che fa in modo che il secondo thread aspetterà finché il monitor non viene rilasciato."

"Giusto. Una volta che un thread entra nel blocco etichettato sincronizzato, l'oggetto monitor viene contrassegnato come occupato e gli altri thread saranno costretti ad attendere il rilascio dell'oggetto monitor. Lo stesso oggetto monitor può essere utilizzato in varie parti del programma. "

"A proposito, perché hai scelto il nome monitor?"

"Un monitor è ciò che di solito chiami un oggetto che memorizza lo stato occupato o libero."

"Ed è qui che entrano in gioco i metodi di attesa e notifica ".

"In realtà, questi sono davvero gli unici due metodi. Gli altri sono solo adattamenti di questi metodi."

"Ora scopriamo cos'è il metodo wait e perché ne abbiamo bisogno. "

"A volte ci sono situazioni in un programma in cui un thread entra in un blocco di codice sincronizzato e blocca il monitor, ma non può andare avanti perché mancano alcuni dati. Ad esempio, un file che deve elaborare non ha terminato il download o qualcosa del genere."

"Potremmo semplicemente aspettare che il file venga scaricato. Potresti semplicemente controllarlo usando un ciclo. Se il file non è stato ancora scaricato, allora dormi per circa un secondo e controlla di nuovo fino a quando non viene scaricato."

"Qualcosa come questo:"

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

"Ma nel nostro caso, questo tipo di attesa è troppo costoso. Poiché il nostro thread ha bloccato il monitor, anche altri thread sono costretti ad attendere anche se potrebbero già disporre dei dati di cui hanno bisogno."

"Il metodo wait() è stato inventato per risolvere questo problema. Questo metodo fa sì che il thread rilasci il monitor e quindi «sospenda» il thread.

"Puoi chiamare il metodo wait di un oggetto monitor solo quando il monitor è occupato, cioè solo all'interno di un blocco sincronizzato . Quando ciò accade, il thread interrompe temporaneamente l'esecuzione e il monitor viene rilasciato in modo che altri thread possano usarlo."

"Ci sono spesso casi in cui un thread entrerà in un blocco sincronizzato e chiamerà wait, rilasciando così il monitor."

"Quindi entrerà un secondo filo e verrà sospeso, poi un terzo e così via."

"E come si riprende un thread?"

"Per questo, c'è un secondo metodo: notifica."

"Puoi chiamare i metodi notify / notifyAll di un oggetto monitor solo quando il monitor è occupato, cioè solo all'interno di un blocco sincronizzato . Il metodo notifyAll risveglia tutti i thread in attesa su questo oggetto monitor."

"Il metodo notify 'sblocca' un thread casuale, ma il metodo notifyAll sblocca tutti i thread «congelati» di questo monitor."

"Molto interessante. Grazie, Rishi."

"Esistono anche adattamenti del metodo wait():"

metodo wait() Spiegazione
void wait(long timeout)
Il thread «si blocca», ma si «sblocca» automaticamente dopo aver atteso il numero di millisecondi passati al metodo come argomento.
void wait(long timeout, int nanos)
Il thread «si blocca», ma si «sblocca» automaticamente dopo aver atteso il numero di nanosecondi passato al metodo come argomento.

"Lo chiamiamo anche attesa con timeout. Il metodo funziona come una normale attesa, ma se il tempo specificato è trascorso e il thread non è stato riattivato, si riattiva da solo."