2010-04-16 1 views
20

Capisco che jvm sia esso stesso un'applicazione che trasforma il bytecode dell'eseguibile java nel codice macchina nativo, ma quando si utilizzano i thread nativi ho alcune domande a cui non riesco a rispondere.Comprendere i thread nativi di java e la jvm

  • fa ogni filo creare la propria istanza della JVM per gestire il loro particolare esecuzione?
  • Se non allora l'jvm deve avere un modo per programmare quale thread tratterà successivo, in tal caso non sarebbe questo rende la natura multi-thread di java inutile poiché soltanto un thread può essere eseguito in un momento?

risposta

22

Ogni thread crea la propria istanza di jvm per gestire la loro esecuzione particolare?

No. Eseguono nella stessa JVM in modo che (ad esempio) possano condividere oggetti e attributi di classe.

Se poi non la jvm deve avere un modo per programmare quale thread tratterà successivo, in tal caso non sarebbe questo rende la natura multi-thread di java inutile poiché solo thread può essere eseguito in un tempo?

Esistono due tipi di implementazione di thread in Java. I thread nativi sono mappati su un'astrazione di thread implementata dal sistema operativo host. Il sistema operativo si occupa della pianificazione del thread nativo e del time slicing.

Il secondo tipo di filettatura è "fili verdi". Questi sono implementate e gestite dalla JVM stessa, con la programmazione filo attuazione JVM. Le implementazioni dei thread verdi non sono più supportate da Sun JVMs, AFAIK.

1

I thread Java sono mappati ai thread del sistema operativo nativo. Hanno poco a che fare con la JVM stessa.

8

Ogni thread crea la propria istanza di jvm per gestire la loro esecuzione particolare?

No, l'applicazione in esecuzione nella JVM può avere molti thread che esistono tutti all'interno dell'istanza di JVM.

Se poi non lo fa la JVM devono avere un modo per programmare quale thread è in grado di gestire la prossima ...

Sì, la JVM ha un thread scheduler. Ci sono molti diversi algoritmi per la pianificazione del filo, e quale è utilizzato è JVM-vendor dipendente. (Scheduling in generale è un argomento interessante.)

... se così non questo rende la natura multi-thread di java inutile poiché soltanto un thread può essere eseguito in un momento?

Non sono sicuro di aver capito questa parte della tua domanda. Questo è il tipo di threading. È in genere sono più thread di CPU, e si desidera eseguire più di una cosa alla volta. Threading consente di trarre il massimo (er) vantaggio della CPU facendo in modo che sia occupato di elaborazione un thread mentre un altro è in attesa su di I/O, o è per qualche altro motivo non occupato.

+0

"Sì, la JVM ha un thread scheduler. Ci sono molti diversi algoritmi per la pianificazione filo, e che uno è usato è JVM-vendor dipendente" penso che ci sia un fuorviante qui, perché se i thread Java creano un nativo thread (non thread verdi), quindi JVM non ha bisogno di pianificazione o non pianifica perché il sistema operativo lo fa tramite il cambio di contesto. Ho ragione? Perfavore, correggimi se sbaglio. – PeerNet

4

Un thread Java può essere mappato uno a uno su un thread del kernel. Ma questo non deve essere così. Potrebbero esserci n thread del kernel che eseguono m thread java, dove m potrebbe essere molto più grande di n e n dovrebbe essere più grande del numero di processori. La stessa JVM avvia i n thread del kernel e ognuno di essi preleva un thread java e lo esegue per un po ', quindi passa ad un altro thread java. Il sistema operativo preleva i thread del kernel e li assegna a una CPU. Quindi potrebbe esserci una programmazione dei thread su più livelli. Potresti essere interessato a consultare il linguaggio di programmazione GO, dove migliaia di cosiddette "goroutine" vengono eseguite da dozzine di thread.

+0

AFAIK Non è corretto. I thread JVM mappano 1: 1 con il sistema operativo nativo. Puoi mostrare un esempio per ottenere m: n mapping? –

+0

@PiyushKatariya - Penso che sia specifico per la piattaforma. Ad esempio, tutte le versioni precedenti a Java 9 di Sun/Oracle Java per Solaris supportavano la mappatura dei thread N-M: http://reins.altervista.org/java/Java_and_Solaris_Threading.htm –