如何管理执行者

时间:2011-11-11 15:17:50

标签: java concurrency executors

在我的实践中,我开发的软件变得越来越复杂,并且它的各个部分以自己的方式使用执行器,这种情况并不罕见。从性能的角度来看,最好在每个部分使用不同的线程池配置。但是从可维护性和代码可用性的角度来看,如果所有与线程,并发性和CPU利用率相关的东西都保存在某个集中位置并进行配置,那将更为可取。

让每个需要一些并发执行或调度的类创建自己的线程池是不行的,因为很难控制它们的生命周期和总线程数。

创建某种 ExecutorManager 并在应用程序周围传递一个线程池也不行,因为,根据任务的类型和提交率,工作队列和线程池大小的不适当配置组合可以伤害表现真的很糟糕。

所以问题是:是否有一些解决这个问题的常用方法?

2 个答案:

答案 0 :(得分:2)

我会创建2或3个threadPools,可以根据执行的任务进行不同的配置,如果有3个以上的不同并发操作则会出现更大的问题。

可以在需要时(例如通过名称)注入池,另外我将创建注释以使用AOP(例如aspectj)执行具有特定池/执行器的定义方法。

注释解析器应该可以访问所有池/执行器,并使用注释中指定的任务提交任务。

例如:

@Concurrent ("pool1")
public void taskOfTypeOne() {
}

@Concurrent ("pool2")
public void taskOfTypeTwo() {
}

答案 1 :(得分:1)

您正在寻找的是依赖注入控制反转。最受欢迎的Java DI框架之一是Spring。您可以构建普通的Java对象,但是使用特定的注释或通过在XML中配置它们,将它们连接在一起。这样,您可以在一个位置配置不同的ExecutorService实例,并请求在需要它们的客户端类中注入它们(可能通过名称)。