为什么增加newFixedThreadPool导致性能不佳?

adh*_*dhg 4 java concurrency multithreading callable java.util.concurrent

我正在尝试更改报告的执行并将其以并发方式完成.在'serail模式'中,执行测试需要30秒,当使用并发模式时,我得到27秒(考虑到连续几步必须采取结果).

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

ExecutorService executor = Executors.newFixedThreadPool(4);
Run Code Online (Sandbox Code Playgroud)

我的计算机装有2x2.6 Ghz四核,如果newFixedThreadPool为高(16),我希望执行时间会减少.实际上,我增加newFixedThreadPool越多,执行速度越慢.这引出了一个问题:我做错了什么或者我没理解什么?!?!

我从我的执行中嵌入了2个结果截图.

A. newSingleThreadExecuter - 在23秒内运行

B. newFixedThreadPool(4) - 在43秒内运行.

每次我提交一个'Worker'我得到system.out currentTimeMillis和'fatched tkt'结果是从db获取数据所需的毫秒数.(在策略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();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

Gra*_*ray 5

我增加newFixedThreadPool越多,执行速度越慢

通常,如果您将线程添加到作业并且不会加快速度,则可能是由于以下几种原因之一:

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

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

但是,如果您的应用程序运行速度快一半,那么这是一个有趣的情况.我只能猜测它是两者的组合.

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

您还可以查看系统统计信息,以查看IO通道是否已超出范围.磁盘是一个常见的问题.查看是否可以在内存磁盘上运行以查看应用程序是否运行得更快.这将是您受IO约束的指标.

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