ThreadPoolExecutor实现

时间:2014-11-28 09:16:56

标签: java multithreading performance java.util.concurrent threadpoolexecutor

我已经阅读了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线程列表的随机线程比使用固定线程池慢几毫秒。我怀疑额外的开销来自两个地方:

  • 检查isInterrupted:它委托给一个本机方法,这会导致JNI开销。这与TPE不同,因为它使用队列中下一个任务的结果来确定线程循环。
  • 线程迭代:我遍历线程列表以找到具有最少量计划任务的线程,因为工作者运行均匀。 TPE实际上是基于corePoolSize和最大允许池大小的工作者,而自由工作者从工作队列中窃取任务。

那么,如何实现ThreadPoolExecutor使其如此高效?

0 个答案:

没有答案