Я использую TheadPoolExecutor, который выполняется в PriorityQueue. Я установил минимальный размер пула 5 и максимум 50. Когда мы выполнили тест нагрузки, мы увидели, что 10% -ый прыжок - это CPU. Свалка нить показываетПроизводительность процессора с использованием ThreadPoolExecutor
бассейн-1-нить-5" PRIO = 3 TID = 0x020f69a0 NID = 0xa3 ожидание состояния [0xb517f000..0xb517f970] на sun.misc.Unsafe.park (нативный метод) на Java .util.concurrent.locks.LockSupport.park (LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await (AbstractQueuedSynchronizer.java:1841) at 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)
Чувствуете ли вы, что preartAllCoreThreads(), которое я использую в ThreadPoolExecutor, будут иметь проблемы с производительностью?
ТИА
Простые потоки ничего не делают, если у вас есть 5 или 5000. Создание потоков имеет накладные расходы и потребляет ресурсы, но как только они создаются, они только теряют память, а не процессор. BTW: Вы уверены, что хотите больше потоков, чем у вас есть ядра? (или у вас есть 50 свободных ядер) –
Имея больше потоков, чем ядра, имеет смысл, если они связаны с IO, однако слишком много потоков могут тратить процессорное время с чрезмерным количеством переключателей контекста. См. Http://blogs.mulesoft.org/chasing-the-bottleneck-true-story-about-fighting-thread-contention-in-your-code/ для очень интересного объяснения. – Pino