Java ThreadPoolExecutor是否应用模板模式?

Java ThreadPoolExecutor是否应用模板模式?,java,threadpoolexecutor,template-method-pattern,Java,Threadpoolexecutor,Template Method Pattern,中有两种钩子方法 这种技术让我想到了模板方法模式,在抽象类中有hook方法。但是,template method的抽象类中的钩子方法与ThreadPoolExecutor的不同之处在于: ThreadPoolExecutor类是具体的,而在模板方法模式中定义钩子方法的类是抽象的 在ThreadPoolExecutor中,诸如beforeExecute(线程t,可运行r)和afterExecute(可运行r,可丢弃t)等钩子方法是具体的,方法体为空,而模板方法模式的abstract类中的钩子方法

中有两种钩子方法

这种技术让我想到了模板方法模式,在
抽象类中有hook方法。但是,template method的抽象类中的钩子方法与ThreadPoolExecutor的不同之处在于:

  • ThreadPoolExecutor
    类是具体的,而在模板方法模式中定义钩子方法的类是抽象的
  • ThreadPoolExecutor
    中,诸如
    beforeExecute(线程t,可运行r)
    afterExecute(可运行r,可丢弃t)
    等钩子方法是具体的,方法体为空,而模板方法模式的
    abstract
    类中的钩子方法是
    abstract
    ,尽管事实上这两个钩子方法都是
    受保护的
    ,这表明它们应该在其子类中被
    覆盖
因此,我的问题是:

  • ThreadPoolExecutor
是否属于模板方法模式
  • 是hook方法本身。独立于模板方法模式的技术
    就个人而言,我会说,因为ThreadPoolExecutor预先定义了一组在子类化时无法更改的命令,因为它被标记为
    final
    。请参见
    #runWorker
    。 这是模板:第一个
    在执行前执行
    ,第二个
    任务。运行
    ,第三个
    在执行后执行

    final void runWorker(Worker w) {
      // ... snip
         beforeExecute(wt, task);
         try {
               task.run();
         } 
         ...
         } finally {
            afterExecute(task, thrown);
         }
    
       // ... snip
    } 
    
    它将实现的某些部分留给子类,
    beforeExecute
    afterExecute


    但是是的,我知道可能会有讨论,因为在这种情况下,类只有钩子(未标记为抽象,所以允许,但不是要求)来控制子类。

    非常感谢您的意见:)因此,面向对象编程语言中的钩子方法似乎不能独立于模板方法而存在,是吗?当你从逻辑上考虑它时,创建一个没有最终模板方法的具有钩子的类是没有意义的,是的。谢谢:)在再次仔细阅读gof23之后,我发现其中提到了钩子操作,这是默认方法,可以重写。基于此,我同意你的回答