基本概念:
串行:多個任務順序進行
並行:多個任務同時進行,物理上的同時發生。不影響
並發:多個任務在同一時間間隔進行,一起完成,邏輯上的同時發生。例如:cpu來回切換
進程和線程:
進程:正在運行的程序,是系統進行資源分配和調用的獨立單位,每個進程都有自己的內存空間和系統資源
單進程就是你的電腦一次只能運行一個程序
多進程是電腦可以同時聽歌和打游戲,但這不是並行執行,cpu一個時間只能做一件事情,是因為cpu在多個任務來回切換,屬於並發執行,切換速度快給人的感覺就像是同時執行
線程:
程序的執行單元,cpu調度的基本單位
單線程:程序只有一條執行路徑
多線程:程序有多條執行路徑
多線程的意義:
多線程的存在,不是為了提高程序的執行速度,而是為了提高程序的使用率和cpu利用率。
程序執行是為了搶到cpu的執行權,線程越多的進程,搶到執行權的幾率越大
實習線程的幾種方式
-
繼承Thread類
- 重寫run方法
- 通過start調用啟動
測試類
-
實現Runnable接口
- 重寫run
- 把類作為參數傳到Thread里
- 通過start調用
測試類
獲取當前線程
public static Thread currentThread()
線程命名
-
setName
-
構造
線程優先級
setPriority()
- 只是修改概率,並不是優先級高就一定能搶到時間片
- 優先級有1-10整數,默認為5
- 放在start之前
線程執行順序圖
優先級
線程的協同調度模型
- 分時調度模型:所有線程輪流使用cup
- 搶占式調度:一起搶,誰搶得到誰使用,優先級高的線程,搶到的概率大些
- 弊端:時間不可控
休眠
Thread.sleep();
加入線程
join();
線程禮讓
- 讓當前運行狀態的線程釋放自己的cpu資源,從運行狀態變為就緒
- 變為就緒后重新和其他線程搶資源
守護線程(后台線程)
setDaemon(true)
主線程結束,守護線程也在一段時間跟着結束,沒有立馬結束是因為程序關閉的時間
jvm啟動是多線程
中斷線程
stop,讓線程停止,已過時,因為是暴力停止。不建議使用
interrupt,把線程狀態終止,並拋出lnterruptedException
interrup,不能直接終止線程,只是改變了當前線程的狀態
某個線程調用interrupt方法后,拋出異常,需要在線程方法中捕獲該異常並處理