2012-12-25 10 views
5

Qualcuno può aiutarmi a capire come viene implementata la funzione Thread.sleep()? Un thread riprende/si attiva quando scade il tempo specificato o quando si interrompe un altro thread. Sono interessato a capire il modello di progettazione dietro il funzionamento di questo.Implementazione Java Thread.sleep()

Si dice che Sleep non abbia alcun effetto sul consumo della CPU. Il thread corrente è aggiunto a un elenco di listener? Quando si verificherà il flag di interrupt? 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 supporta il sistema operativo)? In che modo il thread ottiene il controllo indietro senza influenzare la CPU.

Ho cercato questo. Scusate se ho perso qualche link che è facile da trovare.

+0

E 'implementato dal sistema operativo, non è da Java. La tua domanda è davvero fuori tema. – EJP

risposta

13

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); 
+0

Grazie mille. Questo bussa alla maggior parte delle mie interpretazioni errate. Ho solo un'altra domanda. Quando viene costruita InterruptedException? Esiste una funzione di callback che viene eseguita quando il sistema operativo segnala un'interruzione o una scadenza? –

+0

@Praneethvarma: quando il thread si risveglia, può controllare perché è stato svegliato. Ho pubblicato il codice C da OpenJVM dove è implementato questo controllo. –