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
}
它将实现的某些部分留给子类,beforeExecute
,afterExecute
。
但是,是的,我知道可以进行讨论,因为在这种情况下,该类只有钩子(未标记为抽象,因此允许但不是必需的(来控制子类。