English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spiegazione dettagliata del metodo wait di Object in java

Metodo wait di Object in Java

Quando il thread B accede a una risorsa condivisa, desidera ottenere l'oggetto di locking della risorsa, scoprendo che questo locking è stato ottenuto dal thread A. In questo momento, il thread B può solo essere sospeso e aspettare che il thread A rilasci il locking.

Ma mentre il thread A che ha ottenuto il blocco di locking esegue, a causa di alcune condizioni non soddisfatte, non desidera continuare l'esecuzione e vuole aspettare un po' (attenzione: è il thread A che ha già ottenuto il blocco di locking che vuole aspettare attivamente), sperando di attendere che alcune condizioni siano soddisfatte prima di continuare a eseguire il compito. Nel blocco di codice sincronizzato, il thread A deve prima rilasciare il blocco di locking, il thread B ha il diritto di ottenere il blocco di locking, entrare nel blocco di codice sincronizzato e eseguire il codice. Dopo che il thread B ha completato l'esecuzione, le condizioni necessarie per il thread A sono soddisfatte, quindi in questo momento c'è bisogno di un meccanismo di notifica per far passare il thread A dallo stato di attesa allo stato di esecuzione e continuare a eseguire il codice.

Alcuni studenti pensano che il thread A può anche continuare a fare un ciclo di verifica, controllando se la condizione è soddisfatta, senza necessariamente interrompersi e aspettare. Anche questo è un tipo di pensiero, ma cosa? Piuttosto consuma CPU e non si sa quando la condizione sarà soddisfatta.

Per coordinare e comunicare tra thread, è necessario avere un meccanismo di attesa e un meccanismo di notifica, in JAVA corrispondono ai metodi wait e notify.

Metodo wait di Object

synchronized (obj) {
    while (condizione non è ok){
      obj.wait();
    }
 }

Per far sì che il thread A sia in stato di attesa, puoi chiamare il metodo wait dell'oggetto corrente. Una volta chiamato il metodo wait, significa che: il thread A ha ottenuto il lock e ha fatto tutto ciò che poteva fare, ora può solo aspettare, aspettando che altre operazioni同步 esegua qualche codice prima di tornare a lavorare.

Attenzione:

Il metodo wait è definito nella classe radice Object, Thread eredita dalla classe Object, quindi naturalmente ha anche il metodo wait. Ma qui non si chiama il metodo wait dell'oggetto thread corrente, ma il metodo wait dell'oggetto corrente con proprietà di lock; questo punto non mi è chiaro, penso che per far sì che il thread A passi allo stato di attesa e venga risvegliato, anche chiamando i metodi wait e notify del thread A potrebbe funzionare, ma probabilmente è molto complicato da implementare. Inoltre, dal punto di vista della scena, definire wait nella classe Object sembra anche ragionevole, indicando che il thread è rimasto nel pool di attesa dell'oggetto.

Grazie per aver letto, spero che possa aiutarti, grazie per il supporto al nostro sito!

Ti potrebbe interessare