Java 为什么newFixedThreadPool的增量会导致性能不佳?
我正在尝试更改报表的执行,并使其并发完成。在“串行模式”中,执行测试需要30秒,而在使用并发模式时,我需要27秒(考虑到串行模式中必须执行的步骤很少,我对结果没有意见) 我还是不明白这句话:Java 为什么newFixedThreadPool的增量会导致性能不佳?,java,multithreading,concurrency,java.util.concurrent,callable,Java,Multithreading,Concurrency,Java.util.concurrent,Callable,我正在尝试更改报表的执行,并使其并发完成。在“串行模式”中,执行测试需要30秒,而在使用并发模式时,我需要27秒(考虑到串行模式中必须执行的步骤很少,我对结果没有意见) 我还是不明白这句话: ExecutorService executor = Executors.newFixedThreadPool(4); 我的计算机配备了2x2.6 Ghz四核,如果新的FixedThreadPool高(16),我希望执行时间会减少。实际上,增加newFixedThreadPool越多,执行速度就越慢。这就
ExecutorService executor = Executors.newFixedThreadPool(4);
我的计算机配备了2x2.6 Ghz四核,如果新的FixedThreadPool高(16),我希望执行时间会减少。实际上,增加newFixedThreadPool越多,执行速度就越慢。这就引出了一个问题:我做错了什么,或者我没有理解什么
我正在嵌入我执行的2个结果截图
A.newSingleThreadExecuter-运行时间为23秒
B.newFixedThreadPool(4)-运行时间为43秒
每次我提交一个'Worker'时,我都会得到system.out的currentTimeMillis,“fatched tkt”结果是从数据库获取数据所需的毫秒数。(在策略A中-需要3毫秒,在B中需要7毫秒)
Stopper=新的Stopper();
for(长iNum:multimap.asMap().keySet())
{
List tickets=(List)multimap.get(iNum);
(长票号码:票)
{
pojoPks=getPkData(iNum);
可调用工作线程=新的MaxCommThread(ticketNumber,pojoPks);
未来提交=执行人提交(工人);
添加(提交);
}
}
System.out.println(“futurues:+futures.size());
for(未来:未来)
{
尝试
{
PojoTicket PojoTicket=future.get();
//其余的在这里做
}捕捉(中断异常e)
{
System.out.println(“------------------------->InterruptedException”);
}捕获(执行例外)
{
System.out.println(“------------------------->ExecutionException”);
}
}
executor.shutdown();
停止;
增加newFixedThreadPool越多,执行速度越慢
通常,如果您向作业添加线程,但它没有加快作业的速度,可能是由于以下原因之一:
- 每个作业都必须在某种资源上同步,因此它们都在为锁争用而斗争,而不是独立运行
- 这些作业没有太多的CPU工作要做。将线程添加到IO绑定进程不会加快速度,因为IO通道可能已经达到最大值
最后,我将探讨当您的作业收获时,为什么会出现任何
执行异常。这可能是其他问题的迹象,但您应该首先了解这一点 嗯。为什么你会收到这么多的ExecutionException
s?你能发布你的工人阶级代码吗?根据你的回答,我深入研究了代码并发现了问题:我有一个同步方法产生了问题。现在,我需要了解如何改进此方法,并将其修复为多线程。谢谢非常好。很高兴我能帮上忙。@Gray你说“磁盘是这里的常见问题。看看你是否可以在内存磁盘上运行,看看你的应用程序是否运行得更快。这将表明你是IO绑定的。”。你能解释一下这里的磁盘是什么意思吗?@Geek我刚才讲的是读写硬盘文件系统。现代内存驱动器是基于芯片的,但老式硬盘仍然有旋转的磁盘,因此称为“磁盘”。其中一大性能杀手是磁盘IO——对永久硬盘的读写。
Stopper stopper = new Stopper();
for (Long iNum : multimap.asMap().keySet())
{
List<Long> tickets = (List<Long>) multimap.get(iNum);
for (Long ticketNumber : tickets)
{
pojoPks = getPkData(iNum);
Callable<PojoTicket> worker = new MaxCommThread(ticketNumber, pojoPks);
Future<PojoTicket> submit = executor.submit(worker);
futures.add(submit);
}
}
System.out.println("futurues: " +futures.size());
for (Future<PojoTicket> future : futures)
{
try
{
PojoTicket pojoTicket = future.get();
//do the rest here
} catch (InterruptedException e)
{
System.out.println("---------------------->InterruptedException");
} catch (ExecutionException e)
{
System.out.println("---------------------->ExecutionException");
}
}
executor.shutdown();
stopper.stop();