java多線程-你需要了解的一切

線程 - 介紹

定義

一個基本的CPU執行單元 & 程序執行流的最小單元

  • 比進程更小的可獨立運行的基本單位,可理解爲:輕量級進程
  • 組成:線程ID + 程序計數器 + 寄存器集合 + 堆棧
  • 注:線程自己不擁有系統資源,與其他線程共享進程所擁有的全部資源。

作用

減少程序在併發執行時所付出的時空開銷,提高操作系統的併發性能。

狀態說明

擁有類似於進程的就緒、阻塞、運行3種基本狀態,具體如下圖:

線程分類

線程主要分爲:守護線程、非守護線程(用戶線程)

守護線程

  • 定義:守護用戶線程的線程,即在程序運行時爲其他線程提供一種通用服務
  • 常見:如 垃圾回收線程
  • 設置方式:thread.setDaemon(true);//設置該線程爲守護線程

非守護線程(用戶線程)
主要包括:主線程 & 子線程。
a. 主線程(UI線程)

  • 定義:Android系統在程序啓動時會自動啓動一條主線程
  • 作用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關)

注:因爲用戶隨時會與界面發生交互,因此主線程任何時候都必須保持很高的響應速度,所以主線程不允許進行耗時操作,否則會出現ANR

b. 子線程(工作線程)

  • 定義:手動創建的線程
  • 作用:耗時的操作(網絡請求、I/O操作等)

守護線程 與 非守護線程的區別

區別:虛擬機是否已退出

  • 當所有用戶線程結束時,因爲沒有守護的必要,所以守護線程也會終止,虛擬機也同樣退出;
  • 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出

線程優先級

表示

線程優先級分爲10個級別,分別用Thread類常量表示。

// 譬如:
Thread.MIN_PRIORITY // 優先級1
Thread.MAX_PRIORITY // 優先級10

設置

通過方法setPriority(int grade)進行優先級設置
默認線程優先級是5,即 Thread.NORM_PRIORITY

多線程 - 介紹

定義

多個線程同時進行,即多個任務同時進行

其實,計算機任何特定時刻只能執行一個任務;
多線程只是一種錯覺:只是因爲JVM快速調度資源來輪換線程,使得線程不斷輪流執行,所以看起來好像在同時執行多個任務而已

作用

Android官方聲明:在多線程編程時有兩大原則:

  • 不要阻塞UI線程(即主線程):單線程會導致主線程阻塞,然後出現ANR錯誤:主線程被阻塞超過5s則會出現錯誤
  • 不要在UI線程之外更新UI組件

所以,我們需要多線程(1個主線程+x個工作線程)來解決上述兩個問題:

  • 將耗時任務放在工作線程中進行

對應原則:不要阻塞UI線程(即主線程),即當我們有耗時的任務,如果在UI線程中執行,那就會阻塞UI線程了,必須要拋到工作線程中去執行;

  • 將更新UI組件放在主線程中進行

對應原則:不要在UI線程之外訪問UI組件,即更新UI組件時,一定得在UI線程裏執行,故需要在工作線程中執行的任務結果返回到UI線程中去更新組件

應用場景

  • 將耗時任務從主線程拋到工作線程中進行
  • 將更新UI組件任務從工作線程拋到主線程中進行

實現方式

Android多線程實現方式包括:

線程調度-調度方式

  • 當系統存在大量線程時,系統會通過時間片輪轉的方式調度線程,因此線程不可能做到絕對的併發
  • 處於就緒狀態(Runnable)的線程都會進入到線程隊列中等待CPU資源

同一時刻在線程隊列中可能有很多個

  • 在採用時間片的系統中,每個線程都有機會獲得CPU的資源以便進行自身的線程操作;當線程使用CPU資源的時間到後,即時線程沒有完成自己的全部操作,JVM也會中斷當前線程的執行,把CPU資源的使用權切換給下一個隊列中等待的線程。

被中斷的線程將等待CPU資源的下一次輪迴,然後從中斷處繼續執行

線程調度 - 調度優先級

Java虛擬機(JVM)中的線程調度器負責管理線程,並根據以下規則進行調度:

  1. 根據線程優先級(高-低),將CPU資源分配給各線程
  2. 具備相同優先級的線程以輪流的方式獲取CPU資源

優先級調度思想:

  • 存在A、B、C、D四個線程,其中:A和B的優先級高於C和D(A、B同級,C、D同級)
  • 那麼JVM將先以輪流的方式調度A、B,直到A、B線程死亡,再以輪流的方式調度C、D

線程同步

定義

當線程A使用同步方法A時,其他線程必須等到線程A使用完同步方法A後才能使用

線程聯合

  • 定義:線程A在佔有CPU資源期間,通過調用join()方法中斷自身線程執行,然後運行聯合它的線程B,直到線程B執行完畢後線程A再重新排隊等待CPU資源,這個過程稱爲線程A聯合線程B
  • 線程A聯合線程B,即在線程A的執行操作裏定義:

進程 - 介紹

定義:是進程實體的運行過程 & 系統進行資源分配和調度的一個獨立單位
作用: 使多個程序可 併發執行,以提高系統的資源利用率和吞吐量
進程狀態說明(前三個爲基礎狀態)

就緒狀態:進程缺少的資源 = 處理機,只要獲得處理機資源立即執行
等待狀態:指 進程缺少其他資源(除了處理機) / 等待某一事件

狀態轉換

線程與進程的區別

單/多進程、單/多線程的區別

假設:進程 = 桌子,單線程 = 1個人吃飯

單進程、單線程:一個人在一個桌子上吃飯
單進程、多線程:多個人在同一個桌子上一起吃飯
多進程、單線程:多個人每個人在自己的桌子上吃飯

總結:

以上講解了多線程的基本概念。下篇帶你探究多線程更多奧祕~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章