2011-10-27 10 views

risposta

10

Lo scheduler è, solitamente, lo scheduler del SO. È influenzato da molti fattori, inclusi ciò che altri processi sulla macchina stanno facendo, ciò che l'hardware sta facendo (interrupt), ecc. A seconda del sistema operativo, suppongo che a volte possano essere coinvolti numeri casuali, ma sospetto che in genere no. È più semplicemente il modo imprevedibile che più intervalli di tempo variabili possono sovrapporsi.

0

A seconda della JVM, JVM potrebbe trasferire il thread come è per OS e lo scheduler pianificherà il thread, o JVM potrebbe decidere di pianificare il thread stesso, quindi la prima differenza (comportamento imprevedibile su 2 macchine diverse per stessa situazione) viene qui, se il thread è stato programmato da JVM o OS, non si può essere sicuri ..... Inoltre ci sono un certo numero di fattori, la priorità del thread è un fattore (possiamo impostare la priorità), la risorsa è un altro fattore ... È meno probabile che siano coinvolti numeri casuali.

+0

Tutte le JVM mainstream correnti lasciano la pianificazione interamente al sistema operativo. Alcune JVM più vecchie utilizzavano thread verdi, ma in quel caso * all * la programmazione dei thread era gestita dalla JVM. –

+0

@MichaelBorgwardt Immagino che il libro SCJP per java 6 debba includere questa spiegazione, non menzionano la differenza tra vecchie e nuove JVM nel libro! comunque grazie per l'aggiornamento – Zohaib

4

L'utilizzo di numeri casuali nello scheduler introdurrebbe un sovraccarico non necessario in una sezione critica del sistema operativo, quindi è molto improbabile che sia la causa, almeno in qualsiasi sistema operativo mainstream.

Un thread in genere viene eseguito finché non viene eseguita una chiamata del sistema operativo che bloccherà o finché non si verifica un'interruzione o finché non scade il suo intervallo temporale (che in definitiva è solo un interrupt del timer). Anche se fosse possibile costruire attentamente le cose in modo che due thread si blocchino sempre in un ordine deterministico, non si ha alcun controllo su esattamente quando si verificano gli ultimi due effetti. L'ordine in cui vengono eseguiti i thread nella tua applicazione sarà eventualmente influenzato da eventi esterni alla tua applicazione.

0

I sistemi operativi moderni utilizzano il cosiddetto Preemtive multitasking. Garantisce ad ogni processo sul sistema una porzione di tempo CPU, con varie regole per quando interromperne uno e lasciare che il prossimo abbia un turno. Ecco perché non hai bisogno di una CPU per processo sulla tua macchina :)

Non è casuale, ma è generalmente imprevedibile.

1

Altre domande fanno i buoni punti con i dettagli tecnici, ma:

per la precisione, programmazione dei thread in Java è abbastanza efficiente controllato da serrature, wait/notify/notifyAll, sonno metodi e altri controlli di concorrenza. Solo in quei momenti durante l'esecuzione dell'applicazione, quando questi non sono presenti, l'ordine di esecuzione di diversi thread non viene definito.

Il motivo principale è probabilmente per facilità di portabilità di Java in diversi sistemi hardware/OS. È anche logico che se tu, come sviluppatore, non definisci l'ordine in cui i diversi thread della tua app debbano essere eseguiti usando i controlli di concorrenza sopra menzionati, non ti importa di esso e non ha importanza allora e può essere arbitrario scelto dalla JVM.

Problemi correlati