Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么newFixedThreadPool的增量会导致性能不佳?_Java_Multithreading_Concurrency_Java.util.concurrent_Callable - Fatal编程技术网

Java 为什么newFixedThreadPool的增量会导致性能不佳?

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越多,执行速度就越慢。这就

我正在尝试更改报表的执行,并使其并发完成。在“串行模式”中,执行测试需要30秒,而在使用并发模式时,我需要27秒(考虑到串行模式中必须执行的步骤很少,我对结果没有意见)

我还是不明白这句话:

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通道可能已经达到最大值

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

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

您还可以查看系统统计信息,查看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();