4

我正在尝试更改报告的执行并使其同时完成。在“串行模式”中,执行测试需要 30 秒,而在使用并发模式时,我需要 27 秒(考虑到必须串行执行几个步骤,我对结果没问题)。

我仍然没有得到的是这一行:

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 中 - 大约需要 3 毫秒,在 B 中最多需要 7 毫秒)。

    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();

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

5

我增加的 newFixedThreadPool 越多执行越慢

通常,如果您将线程添加到作业并且它没有加速它可能是由于以下几个原因之一:

  • 每个作业都必须在某种资源上同步,因此它们都在为锁争用而战,而不是独立运行。

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

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

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

您还可以查看系统统计信息,以查看您的 IO 通道是否已达到最大值。磁盘一个常见的问题在这里。看看你是否可以在内存磁盘上运行,看看你的应用程序是否运行得更快。这将表明您受 IO 限制。

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

于 2012-08-02T18:06:39.717 回答