---------------------- ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! ----------------------
1、如何在自定義的代碼中,隻定義一個線程?
通過對api的查找,java已經提供了對線程這類事物的描述。就是Thread類。
一 建立線程的第一種方式:繼承Thread類。
步驟:
1、定義類繼承Thread。
2、複寫Thread類中的run方法。
3、調用線程的start方法,
該方法兩個作用:啟動線程,調用run方法。
發現運作結果每一次都不同。
因為多個線程都擷取cpu的執行權。cpu執行到誰,誰就運作。
明确一點,在某一個時刻,隻能有一個程式在運作。(多核除外)
cpu在做着快速的切換,以達到看上去是同時運作的結果。
多線程的一個特性:随機性。誰搶到誰執行,至于執行多長時間,cpu說的算。
二 建立線程的第二種方式:
1,定義類實作Runnable接口
2,覆寫Runnable接口中的run方法。
将線程要運作的代碼存放在該run方法中。
3, 通過Thread類建立線程對象。
4,将Runnable接口的子類對象作為實際參數傳遞給Thread的構造函數。
為什麼要将Runnable接口的子類對象傳遞給Thread的構造函數。
因為,自定義的run方法所屬的對象是Runnable接口的子類對象。
是以要讓線程去執行指定對象的run方法。就必須明确該run方法所屬的對象。
5,調用Thread類的start方法開啟線程并調用Runnable接口子類的run方法。
實作方法和繼承方式有什麼差別呢?
實作方法好處:避免了單繼承的局限性。
在定義線程時,建議使用實作方法。
兩種方式差別:
繼承Thread:線程代碼存在Thread子類run方法中。
實作Runnable:線程代碼存在接口的子類的run方法。
Java對于多線程的安全問題提供了專業的解決方式——同步代碼塊
synchronized(對象)
{
需要被同步的代碼
}
其中對象如同鎖。持有鎖的線程可以在同步中執行。
沒有持有鎖的線程即可以擷取cpu的執行權,也進不去,因為沒有擷取擷取鎖。
必須保證同步中隻能有一個線程在運作。
好處:解決了多線程的安全問題。
弊端:多個線程需要判斷鎖,較為消耗資源。
多線程如何找問題:
1,明确哪些代碼是多線程運作代碼。
2,明确共享資料。
3,明确多線程運作代碼中哪些語句是操作共享資料的。
同步函數用的是哪一個鎖?
函數需要被對象調用,那麼函數都有一個所屬對象引用,就是this。
是以同步函數使用的鎖是this。
如果同步函數被靜态修飾後,使用的鎖是什麼呢?
通過驗證,發現不再是this。因為靜态方法中不可以定義this。
靜态進記憶體時,記憶體中沒有本類對象,但是一定有該類對應的位元組碼檔案對象。
類名.class 該對象的類型是class。
靜态的同步方法,使用的鎖是該方法所在類的位元組碼檔案對象。 類名.class
---------------------- ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! ----------------------詳細請檢視:http://edu.csdn.net