1 為什麼要用Runnable
上一篇文章介紹了通過繼承Thread類,實現java多線程。但如果當我們創建的這個線程類還想繼承其他類的時候,這種方法就略顯局限了。這也是java單繼承的局限性。為了避免這種局限性,所以又提供了第二種多線程主體定義的形式:實現Runnable接口。
2 創建一個實現Runnable的對象
我們先創建一個RunnableDemo類,並在裡面創建一個MyThread2內部類,MyThread2實現Runnable接口。實現之後,MyThread2就是一個實現了Runnable的一個子類了。MyThread2類代碼如下圖。
MyThread2,添加一個run方法,這是業務核心。本次線程依然是實現了一個從1到100的報數功能。
3 創建並啟動線程
我們通過new Thread的方式創建3個先出對象。把MyThread2作為參數,傳入剛創建的Thread對象中。這樣就獲取了3個不同的線程對象,調用start方法啟動。效果如下。
從運行的結果來看,成功啟動並執行了3個線程。
4 Thread與Runnable
我們查閱Thread類源碼可以看到,Thread線程類有無參構造函數,也有有參構造函數,上篇文章用的是無參構造函數,本次使用的使用有參構造函數。其中參數就是Runnable函數式接口,而傳入的則是實現了Runnable接口的MyThread2類。
總的來說,通過實現Runnable來規避單繼承局限,但最終仍然是通過Thread的start()方法來啟動線程,而Runnable中的run方法則負責實現線程要跑的業務。
5 Lambda表達式
Runnable是函數式接口,那麼我們可以通過更簡潔的代碼來實現上面的功能。首先我們定義for循環,創建3個線程並啟動。在傳參的地方,通過lambda匿名函數的形式,直接定義我們需要線程做的業務。代碼及測試如下。
這裡創建線程並直接啟動,通過()->{}標準的lambda表達式進行匿名函數傳參入線程。每個人的編程習慣不一樣,使用什麼方式,就全看各位工匠的心情了。
6 結束語
人人都是程式設計師,感謝您的閱讀,歡迎關注。