Ce qui est optimal de la taille du pool de threads pour un simple programme en cours d'exécution du processeur en fonction des tâches en Java
Im en utilisant un pool de threads pour exécuter des tâches qui sont pour la plupart basés cpu avec un peu d'I/O,
de taille plus grande que le nombre de processeurs.
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)
En supposant le cas d'un simple programme qui soumet l'ensemble de ses tâches à cet exécuteur testamentaire et de fait, à peu de chose je suppose avoir un pool de threads plus importante permettrait de ralentir les choses, car l'OS aurait à timeslice elle processeurs plus souvent la chance de donner à chaque thread dans le pool de threads une chance de s'exécuter.
Est-ce exact et si oui, est-ce un réel problème ou principalement théorique, j'.e si j'ai augmenté la taille du pool de threads pour 1000 ne je remarque une énorme différence.
Je savais que quelqu'un allait dire, mais je pense que Ive a clairement précisé les cas d'utilisation et Im essayant d'établir une fonction de la façon dont les pools de threads de travail, les réponses données ci-dessous sont plus utiles.
Voir ces réponses précédentes stackoverflow.com/questions/4049498/...
Voir ces réponses précédentes stackoverflow.com/questions/4049498/...
OriginalL'auteur Paul Taylor | 2012-10-18
Vous devez vous connecter pour publier un commentaire.
Si vous avez des CPU des tâches, comme vous augmentez le nombre de threads que vous obtenez l'augmentation de frais généraux et le ralentissement des performances. Remarque: le fait d'avoir plus de threads que de tâches en attente est juste un gaspillage de ressources, mais ne peut pas ralentir les tâches tellement.
Je voudrais utiliser une plusieurs (par exemple 1 ou 2) du nombre de processeurs plutôt que d'ajouter un seul comme ayant un trop grand nombre de threads peut avoir une quantité surprenante de frais généraux.
si vous avez 9 tâches et 8 processeurs, pour obtenir une bonne planification, chaque processeur doit être interrompue par une autre tâche, ou vous obtenez un cpu qui a deux tâches sens le temps total de remplir tous est doublé. Si vous avez 16 tâches, vous pouvez obtenir la juste utilisation de 8 processeurs en ayant une paire de tâches par uc qui conduit à moins de perturbation des caches et une pire des cas, le temps n'est pas très différent.
Bon, dans mon cas, j'ai probablement beaucoup plus de tâches que les processeurs, permet de supposer 1000, est-ce le cas encore tenir ?
Ce n'est pas le nombre de tâches qui, par le nombre de threads actifs il a de l'annexe équitablement entre votre cpu.
désolé, bien sûr, juste pour que je puisse voir de planification semble plus juste, dites-vous que dans la mise en œuvre d'un particulier thread est toujours liée à particulier cpu, donc une fois que le thread 9 a été exécuté une fois sur le cpu x puis cpux sera toujours courir thread 9 et tout ce thread, il a couru en premier.
OriginalL'auteur Peter Lawrey
De référence, cochez cette description.
http://codeidol.com/java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/
En bref, ce que vous avez (Pas de. CPU + 1) est optimale en moyenne.
Comme les états de lien, l'optimal est un plusieurs de la N_CPUs. Il est intéressant de noter que votre demande aura d'autres fils et de petites quantités de IO encore l'utilisation de l'UC.
Oui vous avez raison Pierre.
OriginalL'auteur Alan J Liu