Java création de thread est cher, car il est un peu juste du travail:
- Un grand bloc de mémoire doit être alloué et initialisé pour la pile de thread.
- Système d'appels doivent être faits pour créer / enregistrer le natif des threads avec le système d'exploitation hôte.
- Descripteurs doit être créé, initialisé et ajouté à la JVM des structures de données internes.
Il est également coûteux dans le sens que le fil des liens en bas de ressources, tant qu'il est vivant; par exemple, la pile de thread, tous les objets accessibles à partir de la pile, la JVM fil des descripteurs, l'OS natif des threads de descripteurs.
Toutes ces choses sont de la plate-forme, mais ils ne sont pas pas cher sur toute la plate-forme Java que j'ai jamais rencontré.
Une recherche Google m'a trouvé un vieux de référence qui présente une création de thread taux de ~4000 par seconde sur un Sun Java 1.4.1 sur un millésime 2002 à double processeur Xeon l'exécution de millésime 2002 Linux. Plus moderne de la plateforme donnera de meilleurs chiffres ... et je ne peux pas commenter sur la méthodologie ... mais au moins ça donne une idée de combien coûte la création de threads est susceptible d'être.
Peter Lawrey de l'analyse comparative indique que la création de threads est nettement plus rapide ces jours-ci dans l'absolu, mais il est difficile de savoir comment une grande partie de cela est dû à des améliorations en Java et/ou l'OS ... ou processeur plus rapide des vitesses. Mais ses numéros de toujours indiquer un 150+ pli amélioration si vous utilisez un pool de threads rapport à la création/de commencer un nouveau thread à chaque fois. (Et il fait le point, que tout cela est relatif ...)
(Ci-dessus suppose "threads natifs" plutôt que de "fils verts", mais les machines virtuelles utilisent tous des threads natifs pour des raisons de performances. Fils verts sont peut-être moins cher de créer, mais vous payez pour cela dans d'autres domaines.)
J'ai fait un peu de creuser pour voir comment Java pile du thread devient vraiment affecté. Dans le cas de OpenJDK 6 sur Linux, la pile de thread est alloué par l'appel à l' pthread_create
qui crée le thread natif. (La JVM ne passe pas pthread_create
un préaffectés de la pile.)
Ensuite, au sein d' pthread_create
la pile est attribué par un appel à l' mmap
comme suit:
mmap(0, attr.__stacksize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
Selon man mmap
, MAP_ANONYMOUS
drapeau causes de la mémoire pour être initialisées à zéro.
Ainsi, même si il pourrait ne pas être essentiel que de nouvelles Java piles de threads sont mis à zéro (par la JVM spec), dans la pratique (au moins avec OpenJDK 6 sur Linux), ils sont remis à zéro.