1. 程式人生 > >Java多執行緒的基本概念及意義

Java多執行緒的基本概念及意義

一、執行緒依賴於程序而存在。
程序,正在執行的程式。是系統進行資源分配和呼叫的獨立單位。每一個程序都有它自己的記憶體空間和系統資源。 二、多程序的意義:        單程序的計算機只能做一件事,而現在都可以做多件事情,支援多程序,可以在一個時間段內執行多個任務。 提高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 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();  //該方法已過時,但還可以使用。不建議使用,顯示stop();          //多長時間執行緒沒有進行就結束了          //主類中呼叫          public void interrupt();      //把執行緒的狀態終止,丟擲異常InterruptedException 十一、執行緒的生命週期
  1. 新建:建立執行緒物件
  2. 就緒:有執行資格,沒有執行權
  3. 執行:有執行資格,有執行權權  
    • 阻塞:由於一些操作讓執行緒處於該狀態。沒有執行資格,沒有執行權,而另一些操作卻可以把它啟用,啟用後處於就緒狀態
  4. 死亡:執行緒物件變成垃圾,等待回收
新建→(start())→就緒→(獲取到了CPU的執行權)→執行→(run()結束、中斷執行緒)→死亡(等待被回收) 執行時也許會有阻塞sleep(),wait(),時間(sleep())到後或喚醒(notify())後繞到就緒狀態,再執行 被別的執行緒搶到執行權就回到就緒狀態 十二、實現多執行緒的方式: 方式一:繼承Thread類       a.自定義類繼承Thread類
      b.在自定義類中重寫run()方法       c.建立自定義類的物件       d.啟動執行緒的物件 方式二:實現Runnable介面(大多數使用)       a.自定義類實現Runnable介面           b.在自定義類中重寫run()方法       c.建立自定義類的物件       d.建立Thread類的物件,並把c步驟建立的物件作為構造引數傳遞       優點:避免由於單繼承帶來的侷限性         適合多個程式的程式碼處理同一個資源的情況,把執行緒同程式的程式碼、資料有效分離,較好的體現了面向物件的設計思想。

多執行緒是java學習進階的重要知識,循序漸進的學習會收穫很多