我已经阅读了Javadocs和ThreadPoolExecutor的来源,这有点令人困惑,我仍然需要一些帮助来理解它是如何实现的。
事实证明,使用固定池大小为4的ThreadPoolExecutor实际上比它的简化版本更快。
根据我的理解,ThreadPoolExecutor的功能归结为向BlockingQueue
添加任务,任务take
n由内部Worker
使用while循环检查null任务。
我的版本:
private final BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue();
while (!Thread.currentThread().isInterrupted()) {
// Surrouded by try/catch
taskQueue.take().run();
}
public void add(Runnable task) {
taskQueue.add(task);
}
根据我使用JMH进行的测试,使用来自4线程列表的随机线程比使用固定线程池慢几毫秒。我怀疑额外的开销来自两个地方:
那么,如何实现ThreadPoolExecutor使其如此高效?