在ThreadPoolExecutor中有两个钩子方法。
这种技术让我想到了模板方法模式,其中abstract类中有钩子方法。但是,模板方法的抽象类中的钩子方法与ThreadPoolExecutor方法的不同之处在于:
ThreadPoolExecutor类是具体的,而在模板方法模式中定义钩子方法的类是abstract。beforeExecute(Thread t, Runnable r)和afterExecute(Runnable r, Throwable t) )在ThreadPoolExecutor中是具体的空方法体,而模板方法模式中的abstract类中的钩子方法是abstract,尽管这两个钩子方法都是protected,表明它们在子类中应该是overridden。所以我的问题是:
ThreadPoolExecutor 是否属于模板方法 pattern?发布于 2018-06-04 07:55:14
就我个人而言,我会说是,因为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。
但是是的,我知道可以进行讨论,因为在这种情况下,类只具有控制子类的钩子(不是标记为抽象的,而是不允许的)。
https://stackoverflow.com/questions/50675307
复制相似问题