Java多執行緒的基本概念及意義
阿新 • • 發佈:2019-01-23
一、執行緒依賴於程序而存在。
程序,正在執行的程式。是系統進行資源分配和呼叫的獨立單位。每一個程序都有它自己的記憶體空間和系統資源。 二、多程序的意義: 單程序的計算機只能做一件事,而現在都可以做多件事情,支援多程序,可以在一個時間段內執行多個任務。 提高CPU的使用率~
問題: 一邊玩遊戲,一邊聽音樂是同時進行嗎?
不是。因為單COU在某一個時間點上只能做一件事情。(多核可以實現,但是會有很多程序,就不行了) 而我們在玩遊戲,或者聽音樂的時候,是CPU在做著程式間的高效切換讓我們覺得是同時進行的。 切換時間超短。
三、執行緒:
1.在同一個程序內又可以執行多個任務,而每一個任務我們就可以看成是一個執行緒。
2.是程式的執行單元,執行路徑。是程式使用CPU的最基本的單位。
a.如果程式只有一條執行路徑,那麼該程式就是單執行緒程式
b.如果程式有多條執行路徑,那麼該程式就是多執行緒程式
四、多執行緒的意義:
1.多執行緒的存在,不是提高程式的執行速度。其實是為了提高應用程式的使用率。
2.程式的執行其實都是在搶CPU的資源,CPU的執行權。
3.多個程序是在搶這個資源,而其中的某一個程序如果執行路徑比較多,就會有更高的機率搶到CPU的執行權。
4.我們是不敢保證哪一個執行緒能夠在哪個時刻搶到,所以執行緒的執行有隨機性。
五、並行和併發:
A:並行是邏輯上同時發生,指在某一個時間內同時執行多個程式
B:併發是物理上同時發生,指在某一個時間點同時執行多個程式 六、Java執行原理 java命令會啟動java虛擬機器,啟動JVM,等於啟動了一個應用程式,也就是啟動了一個程序。該程序會自動啟動一個“主執行緒”,然後主執行緒去呼叫某個類的main方法。所以main方法執行在主執行緒中。在此之前的所有程式都是單執行緒。 jvm虛擬機器至少啟動了垃圾回收執行緒和主執行緒(呼叫main方法),所以是多執行緒的
垃圾回收是以防出現記憶體溢位
C/C++可以去呼叫系統功能並建立程序,然後由Java去呼叫,實現多執行緒程式(Java不可以直接呼叫系統功能)
七、繼承Thread(執行緒)類
a.自定義類繼承Thread類。
b.在自定義類中重寫run()方法(run()方法執行需要被執行緒執行的程式碼)。
c.建立物件。
d.啟動執行緒。
public final void setPriority(); //設定執行緒的優先順序。 MAX_PRIORITY最大優先順序值是10
MIN_PRIORITY最小優先順序是1 NORM_PRIORITY預設優先順序是5 執行緒優先級別高僅僅表示執行緒獲取的CPU時間片的機率高,但是要在多次執行的時候才能看到比較好的效果。 十、執行緒控制: 父類(Thread)方法: a.執行緒休眠 public static void sleep(long millis); //指定毫秒內休眠 //自定義類中run()裡呼叫 Thread.sleep(millis); b.執行緒加入 public final void join(); //等待該執行緒終止,其他執行緒再開始 //主類中呼叫 c.執行緒禮讓 public static void yield(); //暫停當前正在執行的執行緒物件,並執行其他執行緒 //自定義類中呼叫 //讓多個執行緒的執行更和諧,但不能保證一個執行緒一次。 d.後臺執行緒 public final void setDaemon(boolean on); //將該執行緒標記為守護執行緒或使用者執行緒,當正在執行的執行緒都是守護執行緒時(即主執行緒滅亡,守護執行緒隨之消失),Java虛擬機器退出 //該方法必須在啟動執行緒前呼叫 //主類中呼叫 e.中斷執行緒 public final void stop(); //該方法已過時,但還可以使用。不建議使用,顯示stop();
//多長時間執行緒沒有進行就結束了
//主類中呼叫
public void interrupt();
//把執行緒的狀態終止,丟擲異常InterruptedException
十一、執行緒的生命週期
b.在自定義類中重寫run()方法 c.建立自定義類的物件 d.啟動執行緒的物件 方式二:實現Runnable介面(大多數使用) a.自定義類實現Runnable介面 b.在自定義類中重寫run()方法 c.建立自定義類的物件 d.建立Thread類的物件,並把c步驟建立的物件作為構造引數傳遞 優點:避免由於單繼承帶來的侷限性 適合多個程式的程式碼處理同一個資源的情況,把執行緒同程式的程式碼、資料有效分離,較好的體現了面向物件的設計思想。
程序,正在執行的程式。是系統進行資源分配和呼叫的獨立單位。每一個程序都有它自己的記憶體空間和系統資源。 二、多程序的意義: 單程序的計算機只能做一件事,而現在都可以做多件事情,支援多程序,可以在一個時間段內執行多個任務。 提高CPU的使用率~
問題: 一邊玩遊戲,一邊聽音樂是同時進行嗎?
不是。因為單COU在某一個時間點上只能做一件事情。(多核可以實現,但是會有很多程序,就不行了) 而我們在玩遊戲,或者聽音樂的時候,是CPU在做著程式間的高效切換讓我們覺得是同時進行的。 切換時間超短。
B:併發是物理上同時發生,指在某一個時間點同時執行多個程式 六、Java執行原理 java命令會啟動java虛擬機器,啟動JVM,等於啟動了一個應用程式,也就是啟動了一個程序。該程序會自動啟動一個“主執行緒”,然後主執行緒去呼叫某個類的main方法。所以main方法執行在主執行緒中。在此之前的所有程式都是單執行緒。 jvm虛擬機器至少啟動了垃圾回收執行緒和主執行緒(呼叫main方法),所以是多執行緒的
public class MyThread extends Thread{
//比較耗時的程式才執行執行緒
public void run() {
//新增需要被執行緒的程式碼
}
}
public class MyThreadDemo {
public static void main(String[] args) {
MyThread my = new MyThread();
//my.run(); 直接呼叫無執行緒效果
//若直接呼叫run()方法就相當於普通方法的呼叫
//因此還有另一個方法start();
//run()僅僅是封裝被執行緒執行的程式碼,直接呼叫是普通方法
//start()首先啟動了執行緒,然後由jvm呼叫執行緒的run()方法
my.start();
//my.start();再此呼叫,相當於my執行緒被呼叫了兩次,出現IllegalThreadStateException:非法的執行緒狀態
//若想兩個執行緒啟動,需建立兩個物件。
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
public final String getName(); //該方法可以獲取執行緒的名稱,在自定義類中的 run方法中使用 預設顯示Thread-0,Thread-1...
八、自定義執行緒的名稱兩種方法:
a.public final String setName(); //該方法可以自定義執行緒的名稱,在主類中呼叫my1.setName("***");
b.通過在自定義類中加入帶參構造方法如public MyThread(String name) {super(name);} ,然後建立物件時直接加入名稱如MyThread
my1 = new MyThread(“第一個執行緒”);
九、執行緒排程(兩種)以及設定執行緒優先順序:
1.分時排程模型。所有執行緒輪流使用CPU的使用權,平均分配每個執行緒佔用CPU的時間片
2.搶佔式排程模型。優先讓優先順序高的執行緒使用CPU,若相同,則隨機選擇,優先順序高的執行緒獲取CPU的時間片相對多一些。
Java使用的是搶佔式排程模型。
設定執行緒優先順序:
public final int getPriority(); //返回執行緒物件的優先順序。預設優先順序是5。public final void setPriority(); //設定執行緒的優先順序。 MAX_PRIORITY最大優先順序值是10
MIN_PRIORITY最小優先順序是1 NORM_PRIORITY預設優先順序是5 執行緒優先級別高僅僅表示執行緒獲取的CPU時間片的機率高,但是要在多次執行的時候才能看到比較好的效果。 十、執行緒控制: 父類(Thread)方法: a.執行緒休眠 public static void sleep(long millis); //指定毫秒內休眠 //自定義類中run()裡呼叫 Thread.sleep(millis); b.執行緒加入 public final void join(); //等待該執行緒終止,其他執行緒再開始 //主類中呼叫 c.執行緒禮讓 public static void yield(); //暫停當前正在執行的執行緒物件,並執行其他執行緒 //自定義類中呼叫 //讓多個執行緒的執行更和諧,但不能保證一個執行緒一次。 d.後臺執行緒 public final void setDaemon(boolean on); //將該執行緒標記為守護執行緒或使用者執行緒,當正在執行的執行緒都是守護執行緒時(即主執行緒滅亡,守護執行緒隨之消失),Java虛擬機器退出 //該方法必須在啟動執行緒前呼叫 //主類中呼叫 e.中斷執行緒 public final void stop(); //該方法已過時,但還可以使用。不建議使用,顯示
- 新建:建立執行緒物件
- 就緒:有執行資格,沒有執行權
- 執行:有執行資格,有執行權權
- 阻塞:由於一些操作讓執行緒處於該狀態。沒有執行資格,沒有執行權,而另一些操作卻可以把它啟用,啟用後處於就緒狀態
- 阻塞:由於一些操作讓執行緒處於該狀態。沒有執行資格,沒有執行權,而另一些操作卻可以把它啟用,啟用後處於就緒狀態
- 死亡:執行緒物件變成垃圾,等待回收
b.在自定義類中重寫run()方法 c.建立自定義類的物件 d.啟動執行緒的物件 方式二:實現Runnable介面(大多數使用) a.自定義類實現Runnable介面 b.在自定義類中重寫run()方法 c.建立自定義類的物件 d.建立Thread類的物件,並把c步驟建立的物件作為構造引數傳遞 優點:避免由於單繼承帶來的侷限性 適合多個程式的程式碼處理同一個資源的情況,把執行緒同程式的程式碼、資料有效分離,較好的體現了面向物件的設計思想。
多執行緒是java學習進階的重要知識,循序漸進的學習會收穫很多