1、基本概念:程式、行程、執行緒
程式
- 完成特定任務、用某種語言撰寫的一組指令的集合,一段靜態的代碼,靜態物件,
行程
- 程式的一次執行程序,或是正在運行的一個程式,動態的程序:產生、存在、和消亡
- 程式是靜態的,行程是動態的
- 行程是資源分配的單位
執行緒
-
執行緒是程式內部的一條執行路徑
-
一個行程,同一時間并行多個執行緒,多執行緒
-
執行緒作為調度和執行的單位,每個執行緒擁有獨立的運行堆疊和程式計數器
-
存在安全問題
-
一個java應用程式,至少有三個執行緒:main()主執行緒,
使用多執行緒的優點
- 提高應用程式的回應,增強用戶體驗
- 提高計算機系統CPU的利用率
- 改善程式結構,將復雜的行程分為多個執行緒,獨立運行
何時需要多執行緒
- 程式需要同時執行兩個或多個任務
- 程式實作一些需要等待的任務時,如:用戶輸入,檔案讀寫操作、網路操作
- 需要后臺運行的程式
單核CPU和多核CPU
單核CPU
- 假的多執行緒,在一個時間單元內,只能執行一個執行緒的任務
- 實際上是單執行緒,運行中將其他行程掛起,執行,執行速度很快,所以在使用上感覺是多執行緒,
多核CPU
- 真正意義上的多執行緒
并行與并發
- 并行:多個CPU同時執行多個任務
- 并發:一個CPU “同時” 執行多個任務,如:秒殺
2、執行緒的創建和使用
執行緒的創建
-
方式一
-
繼承于Thread類
步驟:
- 創建一個繼承于Thread的子類
- 重寫Thread類的run()方法--》此執行緒執行的操作
- 創建Thread類的子類物件(可使用匿名物件)
- 通過此物件呼叫start()
- 若要再創建新的執行緒,需創建新的實體來呼叫start()方法
//例:遍歷100以內的所有偶數 //1.創建一個繼承于Thread類的子類 public class MyThread extends Thread{ //2.重寫Thread類的run() @Override public void run() { for (int i = 0; i <=1000 ; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+":"+i); } } } } class ThreadTest { public static void main(String[] args) { //3.創建Thread類的子類的物件 MyThread myThread= new MyThread(); //4.通過此物件呼叫start()①啟動當前執行緒②呼叫當前執行緒的run() myThread.start(); // 如下操作任然是在main()執行緒執行的 for (int i = 0; i <=1000 ; i++) { if(i%2!=0){ // Thread.currentThread().getName()獲取執行緒名 System.out.println(Thread.currentThread().getName()+":"+i); } } } }
-
-
方式二
-
實作Runnable介面
步驟:
-
創建一個實作了Runnable介面的類
-
實作類中實作Runnable中的抽象方法:run()
-
創建實作類的物件
-
將此物件作為引數傳遞到Thread類的構造器中,創建Thread類的物件
-
通過Thread類的物件呼叫start()
//1. 創建一個實作了Runnable介面的類 class MIThread implements Runnable{ // 2. 實作類中實作Runnable中的抽象方法:run() @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+":"+i); } } } } class ThreadTes{ public static void main(String[] args) { // 3. 創建實作類的物件 MIThread mi= new MIThread() ; // 4. 將此物件作為引數傳遞到Thread類的構造器中,創建Thread類的物件 Thread t1=new Thread(mi); // 5. 通過Thread類的物件呼叫start(),啟動當前執行緒,呼叫當前執行緒的run方法,底層是Thread含有Runnable型別引數的構造器 t1.start(); // 再啟動一個執行緒 Thread t2=new Thread(mi); t2.start(); } }
-
-
-
比較兩種創建方式
-
開發中優先選擇,實作Runnable介面的方式
-
原因:
- 實作的方式沒有類的單繼承的局限
- 實作方式更適合處理多執行緒有共享資料的情況
-
聯系: public class Thread implements Runnable
相同點:兩種方式都需要重寫run() 將執行緒 要執行的邏輯宣告在run()中;
-
執行緒的調度
- 調度策略
- 時間片
- 搶占式,高優先級的執行緒搶占CPU
- java的調度方法
- 先來先服務,先進先出佇列
- 高優先級,優先調度的搶占式策略
執行緒優先級
-
優先級
- MAX_PRIORITY : 10
- MIN_PRIORITY: 1
-
NORM_PRIORITY : 5
-
獲取和設定當前執行緒的優先級
- getPriority()
- setPriority( int p)
-
高優先級的執行緒要搶占低優先級執行緒的CPU執行權,只是從概率上講,高優先級有很高概率會執行,但并不意味著高優先級的執行緒執行完,低優先級的才執行;
3、執行緒的生命周期
執行緒生命周期的五種狀態
-
新建:Thread類或子類物件被宣告創建時
-
就緒:新建的執行緒被start()后,獲取了其他所有的資源,只是沒分配到CPU資源
-
運行:獲取CPU資源,執行
-
阻塞:某種特殊情況下,讓出CPU并臨時終止自己的執行
-
死亡:完成它的全部作業或執行緒提前被強制性的終止,例外導致結束;
-
狀態圖

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/273533.html
標籤:其他
上一篇:Java的集合類
