在我的实践中,我开发的软件变得越来越大和复杂,并且它的各个部分以自己的方式使用执行器的情况并不少见。从性能的角度来看,最好在每个部分使用不同的线程池配置。但是,从可维护性和代码可用性的角度来看,如果所有与线程、并发性和cpu利用率相关的东西都集中保存和配置在某个地方,那将是更可取的。
让每个需要并发执行或调度的类创建自己的线程池是不合适的,因为很难控制它们的生命周期和线程总数。
创建某种ExecutorManager并在应用程序中传递一个线程池也不合适,因为,根据任务类型和提交速率,工作队列和线程池大小的不适当配置组合可能会对性能造成严重损害。
所以问题是:是否有一些常见的方法来解决这个问题?
我会创建2或3个线程池,可以根据他们执行的任务进行不同的配置,如果有超过3个不同的并发操作,你有一个更大的问题。
池可以在需要的时候注入(例如通过名称),另外我会创建一个注释来使用AOP(例如aspectj)使用特定池/执行器执行一个定义的方法。
注释解析器应该能够访问所有的池/执行器,并使用注释中指定的那个来提交任务。
例如:@Concurrent ("pool1")
public void taskOfTypeOne() {
}
@Concurrent ("pool2")
public void taskOfTypeTwo() {
}
你要找的是依赖注入或控制反转。最流行的Java DI框架之一是Spring。您可以构建普通的Java对象,但可以使用特定的注释或在XML中配置它们,以便将它们连接在一起。这样,您可以在一个地方配置不同的ExecutorService
实例,并请求将它们注入(可能通过名称)到需要它们的客户端类中。