Qualcuno può aiutarmi a capire come viene implementata la funzione Thread.sleep()?
Chiama sleep
sul thread nativo sottostante fornito dal sistema operativo.
Il sonno non ha alcun effetto sul consumo della CPU.
Un thread non in esecuzione non consuma il tempo della CPU.
Il thread corrente è stato aggiunto a un elenco di listener?
No.
quando avverrà il controllo per interrupt flag?
Il thread non può controllare il flag di interrupt perché non è in esecuzione. Il sistema operativo può riattivare il thread se richiesto.
Lo scheduler continua a controllare lo stato di interruzione di ogni thread che sta dormendo per ogni "x" quantità di tempo (in base a ciò che il sistema operativo supporta)?
No.
Come fa il filo ottenere il controllo indietro senza effettuare la CPU.
Il filo è svegliato automaticamente dal sistema operativo allo scadere del tempo, o in un altro thread può chiedere al sistema operativo di svegliarsi presto.
Ecco parte del codice dietro Thread.sleep() in OpenJVM:
2811 ThreadState old_state = thread->osthread()->get_state();
2812 thread->osthread()->set_state(SLEEPING);
2813 if (os::sleep(thread, millis, true) == OS_INTRPT) {
2814 // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
2815 // us while we were sleeping. We do not overwrite those.
2816 if (!HAS_PENDING_EXCEPTION) {
2817 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
2818 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
2819 // to properly restore the thread state. That's likely wrong.
2820 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2821 }
2822 }
2823 thread->osthread()->set_state(old_state);
fonte
2012-12-25 00:39:58
E 'implementato dal sistema operativo, non è da Java. La tua domanda è davvero fuori tema. – EJP