黑馬程序員_線程總結2

----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------

線程的兩種創建方式各有什麼特點?

步驟:
1,繼承Thread類。
2,覆蓋run方法。將線程要運行的代碼定義其中。
3,創建Thread類的子類對象,其實就是在創建線程,調用start方法。

如果自定義的類中有多線程要運行的代碼。但是該類有自己的父類。
那麼就不可以在繼承Thread。怎麼辦呢?

Java給我們提供了一個規則。Runnable接口。
如果自定義類不繼承Thread,也可以實現Runnable接口。並將多線程要運行的代碼

存放在Runnable的run方法中。
這樣多線程也可以幫助該類運行。
這樣的操作有一個好處:避免了單繼承的侷限性。

步驟:
1,定義了實現Runnable接口。
2,覆蓋接口的run方法。將多線程要運行的代碼存入其中。
3,創建Thread類的對象(創建線程),並將Runnable接口的子類對象作爲參數傳遞給
Thread的構造函數。爲什麼要傳遞?因爲線程要運行的代碼都在Runnable子類的run方法中存儲。所以要將該run方法所屬的對象傳遞給Thread。讓Thread線程去使用


作爲了解:
線程的狀態。
1,被創建。
2,運行。
3,凍結。
4,消亡。

其實還有一種特殊的狀態:臨時狀態。
該臨時狀態的特點:
具備了執行資格,但不具備執行權。
凍結狀態的特點:
放棄了執行資格。


多線程具備隨機性。因爲是由cpu不斷的快速切換造成的。
就有可能會產生多線程的安全問題。
問題的產生的原因:
幾個關鍵點:
1,多線程代碼中有操作共享數據。
2,多條語句操作該共享數據。
當具備兩個關鍵點時,
有一個線程對多條操作共享數據的代碼執行的一部分。還沒有執行完,另一個線程
開始參與執行。
就會發生數據錯誤。
解決方法:
當一個線程在執行多條操作共享數據代碼時,其他線程即使獲取了執行權,也不可以參與操作。
Java就對這種解決方式提供了專業的代碼。
同步
同步的原理:就是將部分操作功能數據的代碼進行加鎖。

同步的表現形式:
1,同步代碼塊。
2,同步函數。
兩者有什麼不同:
同步代碼塊使用的鎖是任意對象。
同步函數使用的鎖是this。

注意:對於static的同步函數,使用的鎖不是this。是 類名.class 是該類的字節

碼文件對象。
涉及到了單例設計模式的懶漢式。


同步的好處:解決了線程的安全問題。
弊端:
較爲消耗資源。
同步嵌套後,容易死鎖。


要記住:同步使用的前提:
1,必須是兩個或者兩個以上的線程。
2,必須是多個線程使用同一個鎖。
這是纔可以稱爲這些線程被同步了。

死鎖代碼一定會寫。但開發時一定注意避免。

經典示例:火車上的衛生間。只能有一個人使用,且使用時指示燈亮起,提示後面的人等待。還有一個顯而意見的特點,其它車廂的廁所是否有人使用對與本車廂沒有絲毫影響。類比多線程火車上的門就是多線程中的鎖,指示燈就是線程中同步代碼的標誌(類比生產者消費者問題)。至於其它車廂就是要區分是否對同一個對象上鎖了。
----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章