JavaRush /Java Blog /Random-IT /Livello 25. Risposte alle domande dell'intervista sull'ar...
zor07
Livello 31
Санкт-Петербург

Livello 25. Risposte alle domande dell'intervista sull'argomento del livello

Pubblicato nel gruppo Random-IT
Livello 25. Risposte alle domande dell'intervista sull'argomento del livello - 1
  1. Quali sono tutti gli stati dell'oggetto Thread?

    • NUOVO
    • CORRIBILE
    • BLOCCATO
    • IN ATTESA
    • TIMED_WAITING
    • TERMINATO
  2. A quali stati può andare un thread quando entra in un blocco synchronized?

    • CORRIBILE
    • BLOCCATO

    In RUNNABLE, se il blocco di codice contrassegnato synchronizednon è occupato da un altro thread. Altrimenti il ​​nostro thread riceverà lo stato BLOCKED e attenderà il rilascio dell'oggetto mutex.

  3. In quale stato passerà il thread quando chiamerà il metodo wait()?

    La chiamata a questo metodo pone il thread nello stato WAITING.
    Il metodo wait()può essere chiamato solo all'interno di un blocco synchronizedsu un oggetto mutex che è stato "bloccato" dal thread corrente, altrimenti il ​​metodo lancerà un'eccezione IllegalMonitorStateException .

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    Quando viene chiamato un metodo wait(), il thread corrente rilascia il blocco dall'oggetto monitored entra nello stato WAITING, in attesa che il metodo venga chiamato monitor.notify()da monitor.notifyAll()un altro thread. Non appena ciò accade, il thread si riattiverà e se il monitor non era occupato, lo prenderà e continuerà a funzionare.
    Se il monitor è occupato da un altro thread, il thread corrente passerà allo stato BLOCCATO.

  4. In quale stato passerà il thread quando chiamerà il metodo wait(500)?

    La chiamata a questo metodo pone il thread nello stato TIMED_WAITING.
    Per analogia con il metodo wait(), wait(timeout)può essere chiamato solo all'interno di un blocco synchronizedsu un oggetto mutex che è stato “bloccato (bloccato)” dal thread corrente.

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait(500);}

    Quando si chiama il metodo wait(), il thread corrente rilascia il blocco dall'oggetto monitore va in sospensione per 500 millisecondi. L'oggetto monitorpotrebbe essere catturato da un altro thread.
    Dopo 500 millisecondi, il thread si riattiverà e, se monitornon era occupato, lo prenderà e continuerà a lavorare.
    Se il monitor è occupato da un altro thread, il thread corrente passerà allo stato BLOCCATO.

    In quale stato passerà il thread quando chiamerà il metodo notify()?

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    Dopo monitor.wait(), il thread entrerà nello stato WAITING. Un metodo notify()chiamato da un altro thread su un oggetto monitorsposterà il thread dallo stato WAITING allo stato RUNNABLE a meno che l'oggetto monitor non venga catturato da un altro thread, altrimenti allo stato BLOCKED.

  5. In quale stato passerà il thread quando chiamerà il metodo notifyAll()?

    notifyAll()"rimarranno" tutti i thread. Uno di tutti i thread "dormienti" (WAITING) entrerà nello stato RUNNABLE, assumerà il controllo del monitor dell'oggetto utilizzato e continuerà il suo lavoro. Il resto sarà nello stato BLOCCATO. Non appena il primo thread di "risveglio" rilascia il monitor, cosa che tutti gli altri stanno aspettando, il suo destino verrà ripetuto dal thread successivo (un thread arbitrario passerà dallo stato BLOCCATO allo stato RUNNABLE). Ciò continuerà finché tutti i thread "risvegliati" non lasceranno lo stato BLOCCATO.

  6. Tre thread nel blocco sincronizzato chiamati wait()oggetto mutex. A quale stato andranno questi thread se il quarto thread chiama notifyAll()?

    Due di essi passeranno allo stato BLOCCATO, uno allo stato RUNNABLE

  7. In cosa è diverso join(500)da wait(500)?

    Nonostante il fatto che e join(500)trasferirà wait(500)il thread corrente allo stato TIMED_WAITING, ci sono differenze significative tra loro:
    join(500)chiamato su un thread, wait(500)chiamato all'interno di un blocco sincronizzato sull'oggetto su cui questo blocco è sincronizzato.
    Quando viene chiamato, join(500)il thread corrente attenderà 500 millisecondi per il join()completamento del thread il cui metodo è stato chiamato.
    Quando viene chiamato, wait(500)il thread corrente rilascerà il blocco dall'oggetto sincronizzato e andrà in modalità di sospensione per 500 millisecondi.
    Dopo 500 millisecondi in entrambi i casi i thread continueranno a funzionare.

  8. In cosa è diverso wait(500)da sleep(500)?

    sleep(500)chiamato su un thread, wait(500)chiamato all'interno di un blocco sincronizzato sull'oggetto su cui questo blocco è sincronizzato.
    Quando viene chiamato, sleep(500)il thread corrente attenderà 500 millisecondi, quindi continuerà il suo lavoro.
    Quando viene chiamato, wait(500)il thread corrente rilascerà il blocco dall'oggetto sincronizzato e andrà in modalità di sospensione per 500 millisecondi.

  9. In quale stato passerà il thread quando chiamerà il metodo yield()?

    Quando viene chiamato un metodo yield(), il thread corrente “salta il suo turno” e Java passa immediatamente all'esecuzione del thread successivo. Il filo va da stato runninga stato ready. Gli stati in esecuzione e pronto sono sottostati dello stato RUNNABLE.

PS Commenti, aggiunte, correzioni, osservazioni sono benvenuti =)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION