建立一個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修飾的,不允許重寫。好處就是,結構程式碼交給父類,子類只需要實現自己的業務邏輯即可。