1. 程式人生 > >並發_003 線程基本介紹

並發_003 線程基本介紹

返回 提高 pan tar 等待 基本介紹 占用 線程創建 啟動

目錄

  • 線程的優勢
  • 線程的風險
  • JAVA中線程創建方式
  • 線程的調度
  • 線程的狀態

 

線程的優勢

1 發揮多處理器的強大能力(CPU基本調度單位是線程,如果在單核下,使用多線程可以提高吞吐量,多核下,使用多線程能更高的利用CPU資源)

2 建模的簡單性

3 異步事件的簡化處理

4 響應更靈敏的用戶界面

線程的風險

1 安全性(永遠不發生糟糕的事情)問題 多個線程的操作執行順序是不可預測的,甚至會產生奇怪的結果(導致原因:CPU,緩存行,內存)

2 活躍性(某件正確的事情最終會發生)問題

  2.1 死鎖 兩個或兩個以上線程在執行過程中,由於競爭資源或者由於批次通信而造成的一種阻塞的詳細,若無外力作用,它們將無法推進下去(例如:兩輛車在一條馬路上互不想讓)

  2.2 活鎖 任務或者執行沒有被阻塞,由於某些條件沒有滿足,導致一直重復嘗試-失敗-嘗試-失敗的過程(例如:兩輛車在一條那路上相互謙讓,你讓我走,我讓你走,一直謙讓)

  2.3 饑餓 如果一個線程因為CPU時間全部被其它線程搶走而得不到CPU運行時間,這種狀態被稱為"饑餓"(例如:過馬路,別人總是搶在我前面走,導致我一直過不了)

3 性能(正確的事情盡快發生)問題(主要是線程的開銷)

  3.1 上下文切換 CPU通過時間片的分配算法來循環執行任務,當前任務執行一個時間片後會切換到下一個任務,在切換前會保存上一個任務的狀態,以便下次切換這個任務

JAVA中線程的創建方式

1 創建Tread的自雷

2 實現Runnable的接口

3 使用ExecutorService,Callable,Future實現有返回結果的多線程nable接口

線程的調度

1 搶占式調度 每條線程執行的時間,線程的切換都由系統的控制(一個線程的堵塞不會導致整個進程的堵塞)

2 協同式調度 每一條線程執行完完後主動通知系統切換到另一條線程上執行(可能導致整個系統崩潰)

線程的狀態

  技術分享圖片

新建狀態(New) 線程對象被創建後,就進入了新建狀態

就緒狀態(Runnable) 線程對象被創建後,其它線程調用了該對象的start()方法,從而啟動該線程

運行狀態(Running) 線程獲取CPU權限進行執行,線程只能從就緒狀態進入到運行狀態

阻塞狀態(Blocked) 阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行,知道線程進入就緒狀態,才有機會轉到運行狀態

  等待阻塞 通過調用線程的wait()方法,讓線程等待某工作的完成

  同步阻塞 線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所占用),它會進入同步阻塞狀態

  其它阻塞 通過調用線程的sleep()或join()或發起IO請求時,線程會進入到阻塞狀態,當sleep()狀態超時,join()等待線程終止或者超時,或者IO處理完畢時,線程重新轉入就緒狀態

死亡狀態(Dead)線程執行完了或者因異常退出了run()方法,該線程結束生命周期

並發_003 線程基本介紹