4

我试图更改报表的执行,有它在并发完成。在'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(); 

enter image description here

enter image description here

+1

呃。为什么你会得到如此多的'ExecutionException's? – Gray 2012-08-02 18:02:00

+0

你能发布你的Worker类代码吗?这可能会给出更多的线索,看看发生了什么。 – 2012-08-02 18:14:31

回答

5

我越增加的newFixedThreadPool较慢的执行

在一般情况下,如果添加线程工作,它不加快步伐,可能是因为有两个原因之一:

  • 每一份工作都对某种资源的同步,这样他们都争取锁争用,而不是独立运行。

  • 的工作没有太多的CPU工作要做。将线程添加到IO绑定进程不会让事情变得更快,因为IO通道可能已经最大化了。

但是,如果你的应用程序运行速度减半,这是一个有趣的情况。我只能猜测它是它们两个的组合。

要做的一件事就是从1个线程开始,然后尝试2个。如果运行速度不快,请首先查看作业之间共享的锁。每个作业正在修改哪些并发集合或其他对象?尝试减少锁的数量或让线程存储临时信息,然后锁定一次以更新中央对象。

您还可以观察系统统计信息,以查看您的IO通道是否已最大化。在这里遇到一个常见问题。查看是否可以在内存磁盘上运行,以查看您的应用程序运行速度是否更快。这将是一个指标,你是IO界限。

最后,我会研究为什么当你获得工作时,你会得到任何ExecutionException。这可能是其他问题的一个指标,但您应该首先了解这一点。

+1

根据你的回答,我深入研究了代码并发现了问题:我有一个同步方法来创建问题。现在我需要看看如何改进这种方法并修复多线程问题。谢谢! – adhg 2012-08-03 14:46:42

+0

优秀@adhg。很高兴我能帮上忙。 – Gray 2012-08-03 14:50:00

+0

@Gray你说过“磁盘是一个常见问题,看看你是否可以在内存磁盘上运行,看看你的应用程序运行速度是否快,这将表明你是IO绑定的。”你能解释一下Disk的含义吗? – Geek 2012-08-20 05:06:47

相关问题