- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试更改报告的执行并以并发方式完成。在“连续模式”下,执行测试需要 30 秒,而在使用并发模式时,我需要 27 秒(考虑到必须连续执行几个步骤,我对结果没意见)。
我仍然不明白的是这一行:
ExecutorService executor = Executors.newFixedThreadPool(4);
我的计算机配备了 2x2.6 Ghz 四核,如果 newFixedThreadPool 较高 (16),我预计执行时间会减少。实际上,我增加 newFixedThreadPool 的次数越多,执行速度就越慢。这就引出了一个问题:我做错了什么或者我不明白什么?!?!
我嵌入了我执行的 2 个结果截图。
一个。 newSingleThreadExecuter - 在 23 秒内运行
B. newFixedThreadPool(4) - 在 43 秒内运行。
每次我提交“Worker”时,我都会得到 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();
最佳答案
the more I increase the newFixedThreadPool the slower the execution
一般来说,如果您向作业添加线程但它没有加快速度,则可能是由于以下几个原因之一:
每个作业都必须在某种资源上同步,因此它们都在争夺锁,而不是独立运行。
作业没有太多 CPU 工作要做。向 IO 绑定(bind)进程添加线程不会使事情变得更快,因为 IO channel 可能已经达到极限。
但是,如果您的应用程序运行速度减半,这是一个有趣的情况。我只能猜测是两者的结合。
要尝试的一件事是从 1 个线程开始,然后尝试 2 个。如果它没有运行得更快,那么首先查看作业之间共享的锁。每个作业正在修改哪些并发集合或其他对象?尝试减少锁的数量或让线程存储临时信息,然后锁定一次以更新中心对象。
您还可以查看系统统计信息,了解您的 IO channel 是否已达到极限。磁盘是这里的一个常见问题。查看是否可以在内存磁盘上运行以查看您的应用程序是否运行得更快。这将表明您受 IO 限制。
最后,我会研究为什么当您的作业被收割时您会收到任何 ExecutionException
。这可能是其他问题的一个指标,但您应该首先了解这一点。
关于java - 为什么增加 newFixedThreadPool 会导致性能不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11783150/
我有创建 N 个线程(例如 50 个线程)的方法。这些创建的线程使用 Executors.newFixedThreadPool(20) 创建新线程。因此,50 * 20 = 1000 或更多可能会在应
我正在尝试诊断使用 WSO2 身份管理时遇到的问题。 package org.wso2.carbon.identity.mgt; import java.util.concurrent.Executo
这可能是一个有点老的问题。我对 Jboss 环境中的 ExecutorService 工作感到困惑。我使用了一些示例代码,其中我使用 ExecutorService 提交任务,一切完成后我关闭执行程序
请帮助我理解 newFixedThreadPool(或缓存)的内部流程 当我们写下面的语句时,ExecutorService e=Executors.newFixedThreadPool(3); e.
我正在努力弄清楚如何集中资源,我开始怀疑我的线程可能是问题所在(不是 100%,但一直在试验)。我想要做的事情的要点是创建一个服务器 channel 池,然后查看线程是否正在使用它们。我已经成功地获得
我要火了 Executors.newFixedThreadPool(100); 在一个主程序中,生产者提供工作的速度比消费者跟上的速度快。有没有办法查看 newFixedThreadPool 使用的底
我使用了 CopyOnWriteArrayList 集合对象,它包含 1000 个 URL。每个 URL 表示一个文件。 我想使用多线程池机制并行下载这些 URL 文件。 尝试使用以下代码:
对于特定操作,应用程序创建两个线程(执行不同的任务),主线程不会等待它。同样,对于某些情况,它也只能是一个线程。 如果我将其移至 Executors.newFixedThreadPool(),会有什么
我有一个服务方法,它需要并行调用三个方法,如下所示,以使 ServiceMethod() 运行得更快。 public void ServiceMethod() { ExecutorServic
我的英语不好。但我需要了解 newfixedthreadpool 的 . enter code here ExecutorService executorService = new FixedThre
我有一个要求,我需要处理一些当前现场表演的任务。这是一个计划任务,每分钟运行一次。 在任何给定的时刻,可以有任意数量的现场表演(尽管数量不能那么大,大约最多 10)。 所有的直播节目需要完成20多个功
我正在创建用户线程并将它们放入大小=5 的固定池中。我希望我的线程在 5 分钟内执行。这些线程在远程服务器上完成了一些数据库操作。但由于网络延迟,某些线程只是停止并等待远程服务器的响应,因此它会导致我
我对生产者-消费者模式的理解是,它可以使用生产者和消费者之间共享的队列来实现。生产者将工作提交到共享队列,消费者检索并处理它。也可以通过生产者直接提交给消费者来实现(Producer线程直接提交给Co
这个问题在这里已经有了答案: What does a "Cannot find symbol" or "Cannot resolve symbol" error mean? (18 个答案) 关闭
我正在使用 ConcurrentLinkedQueue 来存储计算步骤,并使用 Executors.newFixedThreadPool 创建的 ExecutorService 来执行它们。我的问题是
这个问题在这里已经有了答案: Executors.newCachedThreadPool() versus Executors.newFixedThreadPool() (8 个答案) 关闭 7 年
我正在尝试更改报告的执行并以并发方式完成。在“连续模式”下,执行测试需要 30 秒,而在使用并发模式时,我需要 27 秒(考虑到必须连续执行几个步骤,我对结果没意见)。 我仍然不明白的是这一行: Ex
正如它在 javadoc 中所说的那样 The threads in the pool will exist until it is explicitly shutdowned by Executor
我的程序应该在多线程下运行很长时间。我需要能够为线程设置超时,一旦线程终止,我想再次启动它。这是我的代码: @Test public void testB() throws Inter
我想启动很多任务来在 +-42Mio 记录的数据库上运行。我想以 5000 条记录/时间的批处理运行此程序(结果为 850 个任务)。我还想限制 java 开始为我执行此操作的线程数(最多 16 个)
我是一名优秀的程序员,十分优秀!