我有一个代码块
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种实现
我感到困惑的是,为什么正常的线程和thredpool实现时间会有如此大的差异,并且内部的线程池也没有涉及太多复杂的逻辑。
任何帮助表示赞赏。
提前致谢
最佳答案
这主要取决于您选择的ExecutorService
。在这里,您似乎选择了FixedThreadPool
,如果它的大小足以容纳所有线程,则该代码基本上等效于并行启动线程。由于线程不是动态创建的,因此您甚至可能会获得一些性能改进。ExecutorService
通常是可行的方法,因为它可读性强,可维护且几乎没有开销。在过去的几年中,它也经过了严格的测试。
您的结果清楚地揭示了一个实现问题:您可能对size = 100
示例使用ExecutorService
进行测试,而对其他测试使用size = 25
进行测试。
关于java - 为什么线程池的实现要比普通线程慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21549135/