我试图更改报表的执行,有它在并发完成。在'serail模式'中,执行测试需要30秒,当使用并发模式时,我需要27秒(考虑到必须采取几个步骤才能完成结果)。为什么增加newFixedThreadPool导致性能较差?
,我还没有得到的东西是这一行:
ExecutorService executor = Executors.newFixedThreadPool(4);
我的电脑装备有2x2.6 GHz四核和我预料的执行时间会减少,如果是的newFixedThreadPool高(16)。实际上,我越增加newFixedThreadPool执行越慢。这引出了一个问题:我做错了什么或者我不明白什么?!?!
我从嵌入我的执行2个结果截图。
A. newSingleThreadExecuter - 在23秒
B.运行的newFixedThreadPool(4) - 在43秒运行。
每次我提出“工人”我得到的System.out的的currentTimeMillis和“fatched TKT”的结果是毫秒,它需要从数据库中获取数据。 (在战略A - 它需要〜3ms和B到7ms)。
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();
呃。为什么你会得到如此多的'ExecutionException's? – Gray 2012-08-02 18:02:00
你能发布你的Worker类代码吗?这可能会给出更多的线索,看看发生了什么。 – 2012-08-02 18:14:31