为什么线程池实现比普通线程慢

时间:2014-02-04 09:58:18

标签: java multithreading performance

我有一个代码块

for (i=0;i<size;i++)
{

      do job;

}

最初这个作业任务是按顺序执行的(如上所示),但后来我用普通线程(内部可运行的类实现)做了多线程,比如,

for (i=0;i<size;i++)

{
   new threadingclass(some args) 
}

runnable threadingclass  {

  pub void run () {

      do job;

 }
} 

这很好用一些线程限制(直到系统资源足够)所以为了避免资源重载我用标准的theadpool实现(线程池,执行器服务和工作线程实现)实现了相同的代码

threadexecutor t=new threadexecutor(size)

for (i=0 ; i<size ; i++)

{
   t.execute(new threadingclass(some args))
}

runnable threadingclass  {

  pub void run () {

      do job;

  }
} 

现在的情况就像是,

我想循环运行25次(没有线程),我尝试了所有3个实现

  1. 顺序:约需7分钟
  2. 正常多线程:40秒
  3. 使用线程池进行多线程处理(大小:100):约2分钟
  4. 我有点困惑为什么正常的线程和thredpool实现时序差别很大,而且内部线程池也不涉及太多复杂的逻辑。 任何帮助表示赞赏。

    提前致谢

2 个答案:

答案 0 :(得分:1)

这主要取决于您选择的ExecutorService。在这里,您似乎选择了FixedThreadPool,这基本上相当于并行启动您的线程,如果它的大小足以容纳所有线程。您可能甚至可以获得一些性能提升,因为线程不是即时创建的。

ExecutorService通常是要走的路,因为它是可读的,可维护的并且几乎没有开销。它在过去几年也经过了严格的测试。

您的结果清楚地揭示了一个实施问题:您可能针对size = 100示例使用ExecutorService进行测试,而针对其他示例使用size = 25

答案 1 :(得分:0)

您的处理器很可能只有4或8个核心。在那之后的每个线程实际上都在减慢你的系统速度,因为它必须不断地中断正在运行的线程,以便为下一个线程提供一些时间。

使用4个线程运行线程池,使用4个线程运行手动线程,您将看到性能差异很小。

可以配置

ThreadPool个大小,以及您生成的线程数量......将它们设置为相同的数字以进行有效测试。