1. 程式人生 > >java 多線程筆記

java 多線程筆記

停止 簡單 互斥 line img 進入 機器 訪問 好處

一、先簡單粗暴解釋一下一些與線程有關的概念   1.並行與並發    並行:多個cpu實例或者多臺機器同時執行一段處理邏輯,是真正的同時。    並發:通過cpu調度算法,讓用戶看上去同時執行,實際上從cpu操作層面不是真正的同時。   2.資源共享    多個線程調用資源,是同一個或多個資源。   3.線程安全    在並發的情況之下,代碼經過多線程使用,線程的調度順序不影響最後結果,則是線程安全的。   3.同步     Java中的同步指的是通過人為的控制和調度,保證共享資源的多線程訪問成為線程安全。例如使用@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處理完畢    時,線程重新轉入就緒狀態。

  死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期    二、實現Runnable接口相比繼承Thread類有以下好處: 1.避免單繼承的局限,一個類可以實現多個接口 2.適合資源的共享。
通過例子說明資源共享:   Runnable接口:   技術分享   測試:   技術分享   結果:明顯Runnable可以實現資源共享   技術分享

Thread父類:

  技術分享

  測試:

  技術分享

  結果:沒有實現資源共享

  技術分享

總結: 

(資源共享)   java多線程訪問共享資源的方式:     (1).如果每個線程執行的代碼相同,可以使用同一個Runnable對象,這個Runnable對象中有那個共享數據。     (2).如果每個線程執行的代碼不同,這時候需要使用不用的Runnable對象,這種情況有兩種方式實現:     1.將共享資源封裝在另一個對象中,然後將這個對象逐一傳給各個Runnable對象(在java中,對象(同過new來生成的對象)作為參        數傳遞時,傳遞的是對象的地址),每個線程對共享數據的操作方法也分配到那個對象身上去完成,這樣容易實現針對該數據        進行各個操作的互斥和通信。     2.將這些Runnable對象作為某一個類中的內部類,共享數據作為這個外部類中的成員變量,每個線程對共享數據的操作也分配給外        部類,以便實現對共享數據進行各個操作的互斥和通信,作為內部類的各個Runnable對象調用外部類的這些方法。       總之,要同步互斥的幾段代碼最好放在幾個獨立的方法中,這些方法再放在一個類中,這樣比較容易實現他們之間的互斥和通        信。 (3).簡單極端的方式,在任意一個類中定義一個static變量,static變量將被所有線程共享 (同步)。同步方法/同步代碼塊     註:同步是一種高開銷的操作,因此應該盡量減少同步的內容。    通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可。

  

java 多線程筆記