我正在使用在 PriorityQueue 上执行的 TheadPoolExecutor。我将最小池大小设置为 5,最大池大小设置为 50。当我们运行负载测试时,我们看到 CPU 跳跃了 10%。线程转储显示
pool-1-thread-5"prio=3 tid=0x020f69a0 nid=0xa3 等待条件 [0xb517f000..0xb517f970] 在 sun.misc.Unsafe.park( native 方法) 在 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)
想知道我在 ThreadPoolExecutor 中使用的 prestartAllCoreThreads() 会有任何性能问题吗?
TIA
最佳答案
sun.misc.Unsafe.park
方法是 ThreadPoolExecutor 创建的线程将等待直到收到新消息的地方。 ThreadPoolExecutor 内部有一个队列 Runnable
它会分包给等待的线程。如果您的系统空闲或相当安静,预计会看到相当多的线程在此方法中等待。
如果您正在分析系统,此方法通常会成为时间的主要消耗者。如果线程大部分时间都在等待工作完成,则这是预期的。
关于java - 使用 ThreadPoolExecutor 的 CPU 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3833507/