我有一个代码块
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实现时序差别很大,而且内部线程池也不涉及太多复杂的逻辑。 任何帮助表示赞赏。
提前致谢
答案 0 :(得分:1)
这主要取决于您选择的ExecutorService
。在这里,您似乎选择了FixedThreadPool
,这基本上相当于并行启动您的线程,如果它的大小足以容纳所有线程。您可能甚至可以获得一些性能提升,因为线程不是即时创建的。
ExecutorService
通常是要走的路,因为它是可读的,可维护的并且几乎没有开销。它在过去几年也经过了严格的测试。
您的结果清楚地揭示了一个实施问题:您可能针对size = 100
示例使用ExecutorService
进行测试,而针对其他示例使用size = 25
。
答案 1 :(得分:0)
您的处理器很可能只有4或8个核心。在那之后的每个线程实际上都在减慢你的系统速度,因为它必须不断地中断正在运行的线程,以便为下一个线程提供一些时间。
使用4个线程运行线程池,使用4个线程运行手动线程,您将看到性能差异很小。
可以配置 ThreadPool
个大小,以及您生成的线程数量......将它们设置为相同的数字以进行有效测试。