java 多線程筆記
阿新 • • 發佈:2017-08-13
停止 簡單 互斥 line img 進入 機器 訪問 好處 一、先簡單粗暴解釋一下一些與線程有關的概念
1.並行與並發
並行:多個cpu實例或者多臺機器同時執行一段處理邏輯,是真正的同時。
並發:通過cpu調度算法,讓用戶看上去同時執行,實際上從cpu操作層面不是真正的同時。
2.資源共享
多個線程調用資源,是同一個或多個資源。
3.線程安全
在並發的情況之下,代碼經過多線程使用,線程的調度順序不影響最後結果,則是線程安全的。
3.同步
Java中的同步指的是通過人為的控制和調度,保證共享資源的多線程訪問成為線程安全。例如使用
死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期
二、實現Runnable接口相比繼承Thread類有以下好處:
1.避免單繼承的局限,一個類可以實現多個接口
2.適合資源的共享。
通過例子說明資源共享: Runnable接口: 測試: 結果:明顯Runnable可以實現資源共享
@synchronized。
Java線程具有五中基本狀態
新建狀態(New): 當線程對象對創建後,即進入了新建狀態,如:Thread t = new MyThread();
就緒狀態(Runnable):當調用線程對象的start()方法(t.start();),線程即進入就緒狀態。處於就緒狀態的線程,只是說明此線程已經做好了準備,隨時等待 CPU調度執行,並不是說執行了t.start()此線程立即就會執行;
運行狀態(Running):當CPU開始調度處於就緒狀態的線程時,此時線程才得以真正執行,即進入到運行狀態。註:就 緒狀態是進入到運行狀態的唯一入 口,也就是說,線程要想進入運行狀態執行,首先必須處於就緒狀態中;
阻塞狀態(Blocked): 處於運行狀態中的線程由於某種原因,暫時放棄對CPU的使用權,停止執行,此時進入阻塞狀態,直到其進入到就緒狀態,才 有機會再次 被CPU調用以進入到運行狀態。根據阻塞產生的原因不同,阻塞狀態又可以分為三種:
1.等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態;
2.同步阻塞 -- 線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所占用),它會進入同步阻塞狀態;
3.其他阻塞 -- 通過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢 時,線程重新轉入就緒狀態。
通過例子說明資源共享: Runnable接口: 測試: 結果:明顯Runnable可以實現資源共享
Thread父類:
測試:
結果:沒有實現資源共享
總結:
(資源共享) java多線程訪問共享資源的方式: (1).如果每個線程執行的代碼相同,可以使用同一個Runnable對象,這個Runnable對象中有那個共享數據。 (2).如果每個線程執行的代碼不同,這時候需要使用不用的Runnable對象,這種情況有兩種方式實現: 1.將共享資源封裝在另一個對象中,然後將這個對象逐一傳給各個Runnable對象(在java中,對象(同過new來生成的對象)作為參 數傳遞時,傳遞的是對象的地址),每個線程對共享數據的操作方法也分配到那個對象身上去完成,這樣容易實現針對該數據 進行各個操作的互斥和通信。 2.將這些Runnable對象作為某一個類中的內部類,共享數據作為這個外部類中的成員變量,每個線程對共享數據的操作也分配給外 部類,以便實現對共享數據進行各個操作的互斥和通信,作為內部類的各個Runnable對象調用外部類的這些方法。 總之,要同步互斥的幾段代碼最好放在幾個獨立的方法中,這些方法再放在一個類中,這樣比較容易實現他們之間的互斥和通 信。 (3).簡單極端的方式,在任意一個類中定義一個static變量,static變量將被所有線程共享 (同步)。同步方法/同步代碼塊 註:同步是一種高開銷的操作,因此應該盡量減少同步的內容。 通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可。
java 多線程筆記