3

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

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

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

所以问题是:有一些通用的方法可以解决这个问题吗?

4

2 回答 2

2

我会创建 2 或 3 个线程池,它们可以根据它们执行的任务进行不同的配置,如果有超过 3 个不同的并发操作,你就会遇到更大的问题。

可以在需要时注入池(例如按名称),另外我会创建一个注释来使用 AOP(例如 aspectj)使用特定的池/执行器执行定义的方法。

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

例如:

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

@Concurrent ("pool2")
public void taskOfTypeTwo() {
}
于 2012-12-04T14:29:49.573 回答
1

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

于 2012-12-04T14:37:52.543 回答