方式一:繼承 thread 類
提問:這個run()方法究竟是從哪裡來的呢?
為什麼要有第二種啟動線程的方式
方式二:實作 runnable 接口
總結:
繼承 thread 類建立一個新的線程文法:
别怕,我們一層層分析。
當我們的自定義類繼承了 thread 類後,必須要實作run()方法。要算是一個有意義的線程
為什麼這麼說?
簡單了解:
把線程要做的事情放到run()方法裡,當線程啟動後,會直接執行run()方法裡面的所有代碼。
好,那麼問題來了。
問得很好,run() 方法上方有一個@override 标記,代表它是一個抽象方法,我們都知道子類是必須要繼承父類 thread的抽象方法的,而 thread 又實作了runnable 接口,接口中的方法全都是抽象方法,且不能有方法體,是以說,知道怎麼來的了吧!
要想讓線程能夠得到執行,我們需要啟動線程,這時候線程才能拿到cpu時間片進而才能啟動
啟動線程文法:
例1:
結果為:
重要結論:
如果不調用start() 方法,線程永遠都不會啟動,在主方法沒有調用start()方法之前,thread 對象隻是一個執行個體,而不是一個真正的線程。
學習第二種方式之前,我們需要知道,為什麼有1種實作了以後還要搞第二種不是浪費時間嗎,不,開發者可比我們聰明多了,針對不同的情景,我們會使用不同的方式去實作。
具體原因:
如果程式員需要繼承其他類(非thread 類),因為java不能支援多繼承,此時還要使目前類實作多線程,那麼就可以通過 runnable 接口來實作。
是以我們知道了第二種方式誕生原因後,就一起來學習吧
文法:
其實 thread 類它實作了 runnable 對象,其中的 run()方法正是對 runnable 接口中的 run() 方法的具體實作。
實作 runnable 接口建立線程的流程圖
運作結果(有水印望各位請體諒了解):
注意:這裡我要講解下面這行代碼
當時我有卡在這裡,因為不知道圖檔放在哪裡,getresource() 方法才能擷取到。後面百度了下,才找到了解決的方法:
可以看到,我在 main() 方法裡注釋了一行代碼:
這行代碼,是用來擷取目前目前項目的運作路徑的。結果為:
是以能夠得出,圖檔肯定放在bin目錄下才能擷取到。
run() 方法用來存放 線程執行邏輯
隻有調用 start() 方法才會産生線程實體,并且運作。