我有一个代码块

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种实现
  • sequence:大约需要7分钟
  • 正常多线程:40秒
  • 带有线程池的
  • 多线程(大小:100):约2分钟

  • 我感到困惑的是,为什么正常的线程和thredpool实现时间会有如此大的差异,并且内部的线程池也没有涉及太多复杂的逻辑。
    任何帮助表示赞赏。

    提前致谢

    最佳答案

    这主要取决于您选择的ExecutorService。在这里,您似乎选择了FixedThreadPool,如果它的大小足以容纳所有线程,则该代码基本上等效于并行启动线程。由于线程不是动态创建的,因此您甚至可能会获得一些性能改进。
    ExecutorService通常是可行的方法,因为它可读性强,可维护且几乎没有开销。在过去的几年中,它也经过了严格的测试。

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

    关于java - 为什么线程池的实现要比普通线程慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21549135/

    10-10 04:11
    查看更多