J'utilise TheadPoolExecutor qui s'exécute sur une PriorityQueue. J'ai mis une taille de pool minimum de 5 et maximum de 50. Lorsque nous avons exécuté le test de charge, nous avons vu comme 10% de saut est CPU. La décharge du fil montrePerformance du processeur avec ThreadPoolExecutor
pool-1-fil-5" prio = 3 tid = 0x020f69a0 nid = 0xA3 attente à la condition [0xb517f000..0xb517f970] à sun.misc.Unsafe.park (Méthode natif) à java .util.concurrent.locks.LockSupport.park (LockSupport.java:118) à java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await (AbstractQueuedSynchronizer.java:1841) à java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:200) à java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:470) à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:675) à java.lang .Thread.run (Thread.java:595)
Vous vous demandez si le composant prestartAllCoreThreads() que j'utilise dans ThreadPoolExecutor rencontre des problèmes de performances?
TIA
Les threads inactifs ne font rien, que vous ayez 5 ou 5000. Créer des threads a une surcharge et consomme des ressources, mais une fois qu'ils sont créés, ils ne gaspillent que de la mémoire et non du CPU. BTW: Êtes-vous sûr que vous voulez plus de threads que vous avez des cœurs? (ou avez-vous 50 cœurs libres) –
Avoir plus de threads que de cœurs est logique s'ils sont liés à l'E/S, mais avoir trop de threads peut faire perdre du temps CPU avec un nombre excessif de changements de contexte. Voir http://blogs.mulesoft.org/chasing-the-bottleneck-true-story-about-fighting-thread-contention-in-your-code/ pour une explication très intéressante. – Pino