ThreadPoolExecutor 是否应用模板模式?



ThreadPoolExecutor 中有 2 个钩子方法

这种技术让我想到了模板方法模式,其中abstract类中有钩子方法。但是,模板方法的抽象类中的钩子方法与ThreadPoolExecutor钩子方法不同,如下所示:

  • ThreadPoolExecutor类是具体的,而定义模板方法模式中的钩子方法的类是abstract
  • 钩子方法,如beforeExecute(Thread t, Runnable r)afterExecute(Runnable r, Throwable t),在ThreadPoolExecutor具体的,具有空的方法主体,而模板方法模式类abstract子方法abstract,尽管两个钩子方法protected表明它们应该overridden在其子类

所以我的问题是

  • ThreadPoolExecutor是否属于模板方法模式
  • 钩子方法本身是否是独立于模板方法模式的技术?

就个人而言,我会说是的,因为 ThreadPoolExecutor 预定义了一组命令,这些命令在子类化时无法更改,因为它被标记为final。请参阅#runWorker。 这是模板:第一个beforeExecute,第二个task.run,第三个afterExecute

final void runWorker(Worker w) {
// ... snip
beforeExecute(wt, task);
try {
task.run();
} 
...
} finally {
afterExecute(task, thrown);
}
// ... snip
} 

它将实现的某些部分留给子类,beforeExecuteafterExecute

但是,是的,我知道可以进行讨论,因为在这种情况下,该类只有钩子(未标记为抽象,因此允许但不是必需的(来控制子类。

最新更新