1

我已经养成了将ExecutorServices 包裹在 alisteningDecorator中来制作 a的习惯ListeningExecutorService。我知道这是 Guava 团队的建议,而且似乎总是值得的。

但是,我在这里遇到了一个问题。我的 executors 基于标准是不变的ThreadPoolExecutor,我想将线程池大小的控制权交给我的应用程序(特别是向支持该应用程序的管理员公开)。使用 undecorated ThreadPoolExecutor,执行此操作所需的方法被公开,但包装器对我隐藏了委托。

那么,我需要做什么才能在ThreadPoolExecutor不放弃的情况下回到 api 暴露的 api listeningDecorator

我有几个想法是:

  1. ListeningDecorator创建一个暴露委托的新的
  2. 保留对代表以及装饰的参考Executor
  3. 仅保留对 的引用,并仅在请求ThreadPoolExecutor时包装它ExecutorService
  4. 将我的方式反映给委托并从那里操作线程池大小
4

1 回答 1

2

Guava 团队成员在这里。

我会编写一个新ListeningThreadPoolExecutor类,它基本上是一个ListeningDecorator包装 a 的变体ThreadPoolExecutor,但不是公开委托本身,而是公开转发给委托setCorePoolSize(int size)的方法。ListeningThreadPoolExecutorThreadPoolExecutor

这种方法比选项 1 暴露的内部细节更少,但如果做不到这一点,我会回退到选项 1,正如你所描述的那样。

于 2012-04-19T18:21:13.553 回答