不推薦覆寫start方法

2021-09-22 09:50:51 字數 1440 閱讀 8393

多執行緒比較簡單的方式是繼承thread類,然後覆寫run()方法,在客戶端程式中通過呼叫物件的start方法即可啟動乙個執行緒,這個是多執行緒程式的標準寫法.

錯誤**:

1

public

class

client 9}

1011

class multithread extends

thread

1718

@override

19public

void

run() 24}

25 }

這是乙個錯誤的多執行緒應用,main方法根本沒有啟動乙個子執行緒,整個應用程式中,只有乙個主線程在執行,並不會建立任何其他的執行緒.

只要刪除multithread類中的start方法即可.

1

public

class

client 9}

1011

class multithread extends

thread

1718

@override

19public

void

run() 24}

25 }

很少有人會問,為什麼不必而且不能覆寫start方法,僅僅就是因為"多執行緒應用就是這樣寫的"這個原因?

說明這個原因要看thread類的源**.

public

synchronized

void

start() }//

本地方法

private

native

void start0();

這裡的關鍵是本地方法start0,它實現了啟動執行緒,申請棧記憶體,執行run方法,修改執行緒狀態等職責,執行緒管理和棧記憶體管理都是由jvm負責的,如果覆蓋了start方法,也就是撤銷了執行緒管理和棧記憶體管理的能力,這樣如何啟動乙個執行緒呢?

事實上,不需要關注執行緒和棧記憶體的管理,只需要編碼者實現多執行緒的業務邏輯即可(即run方法體),這也是jvm比較聰明的地方,簡化多執行緒應用.

那如果非要覆寫start方法,如何處理?這確實是乙個罕見的要求,但是覆寫也很容易,只要在start的方法上加上super.start()即可.

1

public

class

client 5}

678class multithread extends

thread

1415

@override

16public

void

run()

19 }

此方式雖然解決了覆寫start方法的問題,但是基本上無用武之地,到目前為止還沒有發現一定要覆寫start方法的多執行緒應用.所有要求覆寫start的場景,都可以通過其他的方式來實現,例如:類變數,事件機制,監聽等方式.

方法過載與方法覆寫

定義 若干個方法名稱相同,引數的型別或個數不同 即引數列表不同 的方法,與方法返回值無關!public class fangfachongzai public static int add int x,int y 方法過載 public static int add int x,int y,int ...

覆寫Activity的finish 方法

mainactivity如下 package cn.testfinish import android.os.bundle import android.view.view import android.view.view.onclicklistener import android.widget....

多型的核心 方法覆寫

物件多型的核心是方法覆寫 1.向上轉型 引數統一化 把乙個子類的例項給了父類 父類 父類物件引用 子類例項 自動 person per new student 看等號的右邊 new的是哪個類,再呼叫的方法有沒有被new的類所覆寫 2.向下轉型 父類需要呼叫子類擴充的功能時 子類 子類物件引用 子類 ...