Differenza tra sonno e attesa (con tavolo)

Java ha diversi metodi per eseguire determinate azioni. Il metodo è un gruppo di codice, che viene eseguito solo quando viene chiamato; e può o meno restituire un risultato.

Metodi come il sonno e l'attesa vengono utilizzati per il multithreading. Entrambi mettono in pausa e mandano il thread in attesa, ma hanno grandi differenze nel funzionamento.

Dormi contro Aspetta

La differenza tra il metodo sleep() e wait() è che il metodo sleep() viene utilizzato nel programma per mettere in pausa l'esecuzione del thread corrente per un particolare periodo di tempo mentre il metodo wait() viene utilizzato nel programma per mettere in pausa o sospendere il thread corrente fino a quando non vengono invocati metodi specifici.

Durante l'utilizzo del metodo sleep, il thread corrente non perde la proprietà del monitor. Lo sleep è un metodo statico e fa parte del thread della classe. Al termine del tempo di attesa, il thread torna allo stato eseguibile originale. Garantisce l'utilizzo completo della CPU, durante l'attesa.

Considerando che il metodo wait() viene utilizzato nel programma Java per ordinare al thread corrente di attendere, fino a quando non viene richiamato un altro thread per quell'oggetto. Il thread prosegue quindi con l'esecuzione, una volta ottenuto il controllo del monitor. Non è un metodo statico a differenza di sleep e fa parte della classe dell'oggetto.

Tabella di confronto tra sonno e attesa

Parametri di confrontoDormire Attesa
ClasseIl metodo sleep fa parte della classe thread Il metodo wait fa parte della classe oggetto
Tipo di metodoIl sonno è un metodo staticoWait non è un metodo statico
Tecnica di chiamataIl metodo sleep può essere chiamato dall'esterno del contesto sincronizzatoIl metodo wait può essere chiamato solo dal contesto sincronizzato
Rilascio della serraturaIl metodo di sospensione non rilascia il blocco sull'oggetto, per il timeout specificato, durante la sincronizzazioneIl metodo Wait rilascia il blocco sull'oggetto, per avere la possibilità di eseguire, durante la sincronizzazione
Dichiarazionesonno vuoto statico pubblico() public final void wait()

Cos'è il sonno?

Il thread sleep() è un metodo statico nel programma Java che sospende il thread corrente e lo mette in stato di attesa per un periodo di tempo stabilito. Una volta che lo stato di attesa e il tempo sono trascorsi, la condizione del thread viene modificata in stato eseguibile. E poi attende la CPU per un'ulteriore esecuzione.

Lo scopo di questo metodo è creare un ritardo di pochi secondi nel programma e contemporaneamente avere il massimo utilizzo della CPU. Se il sistema è occupato o sovraccarico, il tempo di attesa o di pausa è maggiore, altrimenti sarebbe minore o uguale al tempo effettivo.

Il tipo di ritorno del metodo sleep può essere detto void, in quanto non restituisce alcun valore. Il thread di sospensione non perde il monitor né blocca il thread che ha già acquisito. Se in ogni caso il sonno è disturbato, il thread genererà Interrupted_Exception. La durata effettiva della sospensione del thread di solito dipende dagli scheduler e dai timer di sistema che fanno parte del sistema operativo.

La sintassi del metodo sleep è: public static void sleep (lungo millisecondi)

public static void sleep (long millisecondi, int nanosecondi)

Qui millisecondi e nanosecondi è il tempo per il quale il thread dovrebbe dormire.

Cos'è Aspetta?

Wait() è un metodo utilizzato per la comunicazione tra thread. Ogni volta che viene utilizzato il thread wait(), il thread chiamante o corrente viene messo in pausa e sospeso, fino a quando metodi come notify() o notifyAll() non vengono invocati nel sistema.

Il metodo notify() riattiva il thread specificato mentre notifyAll() è applicabile per ogni thread. Una volta sincronizzato, il metodo wait rinuncia al blocco delle risorse. Non esiste un valore di ritorno del metodo Wait, quindi si può dire che restituisce void.

Le due eccezioni del metodo Wait sono Interrupted_Exception (quando il thread corrente viene interrotto durante la sua sospensione) e IllegalMonitorStateException (quando il thread corrente non è il proprietario dell'oggetto sul monitor).

Il metodo Wait fa parte della classe dell'oggetto. Il metodo è applicabile solo e può essere richiamato su un blocco sincronizzato. Il metodo wait libera lo schermo sospeso o bloccato, durante la sincronizzazione. E il metodo Wait consente esclusivamente ai thread multipli sincronizzati di accedere allo stesso oggetto uno per uno.

La sintassi del metodo Wait è: public final void wait()

Principali differenze tra sonno e attesa

  1. Il metodo Sleep fa sì che il thread venga sospeso per un periodo di tempo specifico e particolare, in genere per un timeout specificato, a meno che non sia scaduto o interrotto, mentre il metodo Wait fa sì che il thread venga sospeso fino a quando non vengono richiamati metodi come notify() o notifyAll().
  2. Il metodo Sleep viene eseguito su un thread mentre il metodo Wait viene eseguito su un oggetto.
  3. Il metodo Sleep viene utilizzato per la sincronizzazione dell'ora mentre il metodo Wait viene utilizzato per la sincronizzazione di più thread.
  4. Durante il thread di attesa, più thread sincronizzati possono accedere allo stesso oggetto in modo adiacente mentre nel thread di sospensione, più thread sincronizzati devono attendere il completamento dello stato di sospensione del thread corrente.
  5. Il metodo Wait imposta il blocco o il monitor libero, mentre il metodo Sleep non libera il monitor durante la sospensione o l'attesa del thread corrente.

Conclusione

Il metodo Sleep e Wait sono metodi nativi di Java. Ed entrambi sono ampiamente utilizzati per rendere il thread in corso corrente in uno stato di condizione non eseguibile. Entrambi i metodi vengono utilizzati per il multithreading nel programma.

Il metodo Sleep offre l'esclusiva opzione di bloccare lo schermo per un periodo di tempo specifico che di solito va da nanosecondi a millisecondi. Ma il metodo wait blocca o sospende lo schermo fino a quando non viene richiamato un altro metodo, quindi la durata non rimane specifica come durante l'uso del metodo sleep.

Si differenziano l'uno dall'altro in termini di funzionamento specifico come classe, metodo, sincronizzazione e durata del blocco e del rilascio e molti altri parametri. Spesso i programmatori si confondono su quale metodo potrebbe essere l'ideale per il sonno del thread. L'utilizzo dei metodi dipende da requisiti come la necessità, l'urgenza e il periodo di tempo del thread corrente.

Riferimenti

  1. https://pdfs.semanticscholar.org/51fd/24ae444910fd39b117bb3044a12591f038fa.pdf
  2. https://dl.acm.org/doi/pdf/10.1145/289524.289572
x
2D vs 3D