2013-07-24 17 views
5

Ho letto che i thread Java sono thread a livello utente e una delle differenze tra thread a livello utente e thread a livello kernel è che i thread a livello kernel sono pianificati dal kernel (non possiamo cambiarli) dove per i thread a livello utente possiamo definire il nostro algoritmo di pianificazione.Come pianificare thread Java

Quindi, come possiamo pianificare i thread in Java? In qualsiasi momento, quando più thread sono pronti per essere eseguiti, il sistema runtime sceglie il thread Runnable con la massima priorità per l'esecuzione. Se due thread con la stessa priorità sono in attesa della CPU, lo scheduler ne sceglie uno da eseguire in modalità round robin. Cosa succede se non voglio RR? c'è un modo per cambiarlo o mi manca qualcosa qui?

+3

Cercare di modificare impostazioni di livello basso della JVM di solito è una pessima idea. Qual è il problema che stai cercando di risolvere cambiando l'ordine di esecuzione dei thread? – ssindelar

risposta

8

Non è possibile modificare l'algoritmo di pianificazione come per JVM che non rientra nell'ambito. La JVM utilizza il threading dei thread utente forniti dal sistema operativo sottostante.

Quindi dal punto di vista Java non è possibile modificare l'algoritmo di pianificazione. La pianificazione viene eseguita automaticamente.

L'unica cosa che in Java è possibile fare è set the priority of the thread. Ma come questo influisce sull'algoritmo di schedulazione non è definito.

È possibile provare a modificare l'algoritmo di pianificazione del sistema operativo su cui è in esecuzione la macchina virtuale. Ma questo è altamente dipendente dal sistema operativo utilizzato.

2

Per gli ultimi 10 anni, i thread JVM sono thread a livello di sistema e non thread a livello utente ("verdi"). Anche per i thread a livello di utente, non è possibile gestirli (la JVM lo fa).

1

La specifica JVM non indica come si suppone che le discussioni siano pianificate da un'implementazione. La macchina virtuale Hotspot (e molto probabilmente quasi ogni altra implementazione) utilizza i meccanismi di pianificazione del sistema operativo (come dichiarato da Uwe). Vedi anche What is the JVM Scheduling algorithm?.

Un modo semplice, ma molto probabilmente non molto efficace per influenzare la pianificazione dei thread delle applicazioni sarebbe avere solo n thread eseguibili per il sistema operativo da pianificare (n è il numero di thread che si vorrebbe effettivamente eseguire in parallelo). Ciò potrebbe ad es. essere la propria implementazione di ExecutorService, che fa sì che tutti i thread che non si desidera vengano programmati dal sistema operativo attendono fino a quando non si ritiene che debbano essere eseguiti. Ovviamente in questo modo non si ha alcuna influenza su altri thread VM, figuriamoci altre applicazioni o il sistema operativo.

Molto più coinvolto (e non indipendente dalla piattaforma) sarebbe quello di modificare lo scheduler del sistema operativo stesso in qualcosa di più adeguato alle esigenze di una JVM. Una ricerca rapida su google ha trovato this abstract e credo che ci sia più lavoro su quel campo.

0

In Java efficace, 2 ° ed., Joshua Bloch dedica un articolo alla discussione sulla programmazione dei thread. Si sofferma a lungo su come cercare di modificare la schedulazione dei thread di solito porta solo a soluzioni che sono dipendenti dall'implementazione di JVM, non portabili e fragili.

Se è presente un problema di pianificazione specifico, per il nuovo codice non è comunque necessario gestire le chiamate di thread di basso livello. Java ha librerie di concorrenza di livello superiore che semplificano molte di queste attività. Piuttosto che definire la soluzione al tuo problema con i thread, dovresti pensare a Executor e Task. Ci sono anche strutture di livello superiore che semplificano la comunicazione tra thread, come CountDownLatch.

Chiamate di thread di basso livello come wait, notify e notifyAll possono essere difficili da eseguire correttamente.

0

È possibile scrivere il proprio scheduler di thread, analogamente allo Quartz job scheduler per lavori batch.

Ciò consentirebbe di eseguire thread in varie ore del giorno durante l'esecuzione dell'applicazione.

Se tutto ciò che si desidera è determinare l'ordine di esecuzione del thread, eseguire il codice da un thread principale.