天天看點

黑馬程式員-學習日志-多線程

---------------------- 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

繼續閱讀