Thread中run和start方法的模板設計模式

一生塔山人發表於2021-01-06

 

  建立一個Thread需要繼承Thread重寫run方法或者實現Runnable介面中的run方法,其實兩者都是一樣因為Thread也繼承了Runnable介面。

實現了run方法,但是啟動確實用start方法,那麼這是為什麼?

       Thread使用模板設計模式,執行緒控制的邏輯交給Thread自己,而實現的業務邏輯則交給run方法。

先看一下start方法的一段原始碼:

 1  if (threadStatus != 0)
 2             throw new IllegalThreadStateException();
 3 
 4         group.add(this);
 5 
 6         boolean started = false;
 7         try {
 8             start0();
 9             started = true;
10         } finally {
11             try {
12                 if (!started) {
13                     group.threadStartFailed(this);
14                 }
15             } catch (Throwable ignore) {
16                 /* do nothing. If start0 threw a Throwable then
17                   it will be passed up the call stack */
18             }
19         }

   其中run方法是由第8行start0()來啟動的。

   總的來說就是:run方法來實現自己的業務邏輯,而執行緒的其他控制邏輯交給Thread,也就是start方法中除了啟動run的start0其他邏輯程式碼則是執行緒控制的邏輯程式碼。

  來看一個模板方法的例子:

 

public class TemplateMethodDesign {
    public final void printMsg(String msg){
        System.out.println("System control logic");
        customizedMsg(msg);
        System.out.println("System the other control  logic");
    }

    protected void customizedMsg(String msg){

    }

    public static  void main(String[] args){
        TemplateMethodDesign design = new TemplateMethodDesign(){
            @Override
            public void customizedMsg(String msg) {
                System.out.println(msg);
            }
        };
        design.printMsg("here is your logic");
    }
}

 

 

customizedMsg重寫自己的邏輯,printMsg方法定義控制的邏輯程式碼而且是final修飾的,不允許重寫。好處就是,結構程式碼交給父類,子類只需要實現自己的業務邏輯即可。

 

相關文章