天天看點

Java 實作線程的兩種方式

方式一:繼承 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 接口建立線程的流程圖

Java 實作線程的兩種方式

運作結果(有水印望各位請體諒了解):

Java 實作線程的兩種方式

注意:這裡我要講解下面這行代碼

當時我有卡在這裡,因為不知道圖檔放在哪裡,getresource() 方法才能擷取到。後面百度了下,才找到了解決的方法:

可以看到,我在 main() 方法裡注釋了一行代碼:

這行代碼,是用來擷取目前目前項目的運作路徑的。結果為:

Java 實作線程的兩種方式

是以能夠得出,圖檔肯定放在bin目錄下才能擷取到。

Java 實作線程的兩種方式

run() 方法用來存放 線程執行邏輯

隻有調用 start() 方法才會産生線程實體,并且運作。