Java Executor:小任务还是大任务?

时间:2012-10-03 21:35:11

标签: java multithreading concurrency java.util.concurrent executor

考虑一个可以分解成数百个小的,可独立运行的任务的大任务。更具体地说,每个小任务是发送轻型网络请求并决定从服务器接收的答案。这些小任务预计不会花费超过一秒的时间,并且总共需要几台服务器。

我想到了使用Executor框架实现这一点的两种方法,我想知道哪一个更好,为什么。

  1. 创建一些,比如5到10个任务,每个任务涉及做一堆发送和接收。
  2. 为每个发送和创建一个任务(可调用或可运行)接收并安排执行者运行所有这些(数百个)。
  3. 我很抱歉,如果我的问题表明我懒得测试这些,并亲眼看看哪些更好(至少在性能方面)。在回答这个具体案例时,我的问题有一个更为笼统的方面。在这种情况下,当你想使用执行程序来完成所有的调度和其他工作时,创建大量小任务或将它们分组到更少数量的更大任务中会更好吗?

2 个答案:

答案 0 :(得分:3)

  

创建大量小任务或将这些小任务分组到更少的更大任务中会更好吗?

很难用这样的问题来概括,但在你的情况下,我认为创建一些每个做5到10个事情然后将它提交给执行者服务的任务是没有意义的。

我会将所有工作作为一堆单独的小任务提交给ExecutorService。我认为从对象/代码的角度来看,这将使任务变得更加清晰。他们不必拥有一系列请求/响应,并且可以专注于发出一个请求并处理一个响应。

如果您不想将并发请求发送到特定服务器,则会出现一个例外。然后让任务执行特定服务器的所有请求/响应并为每个服务器提交任务是有意义的。

答案 1 :(得分:2)

总的来说,我会说较小的任务更好,因为它们就像模块一样,并且可以以所需的方式组合,即使需求发生变化。

但是,如果它们只能作为一个块执行,那么您可以通过一项重大任务获得更好的概述。

性能当然也是一个问题。但这在很大程度上取决于服务器/机器的CPU数量和整个系统的负载。即使我们知道你究竟在做什么,你也需要进行测试以确定哪些更有效率。但请记住,任务的初始化和管理也需要一些时间,如果您的操作非常小,您可能会在任务管理上投入比在实际执行中更多的时间。

并行运行所有(小)任务对于需要处理请求的应答服务器来说也可能是困难的。请记住,Web服务通常也会对可以提供的并行请求数量进行限制。