並發_003 線程基本介紹
目錄
- 線程的優勢
- 線程的風險
- 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 線程基本介紹