1. 程式人生 > >黑馬程式設計師——java基礎之多執行緒

黑馬程式設計師——java基礎之多執行緒

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

1. Java 多執行緒程式設計

    Java 語言的優勢之一就是執行緒處理較為簡單。

    一般作業系統都支援執行多個任務,一個任務通常就是一個程式,每個執行中的程式被稱為一個程序,當一個程式執行時,內部可能包含多個順序執行流,每個順序執行流就是一個執行緒。

    1)程式:指令+資料的byte序列,如:qq.exe。

    2)程序:正在執行的程式,是程式動態的執行過程(運行於記憶體中)。

    3)執行緒:在程序內部,併發運程的過程(方法)。

    4)併發:程序是併發進行的,OS將時間劃分為很多時間片段,盡肯能均勻分配給正在執行的程式,微觀上程序走走停停,巨集觀上都在執行,這種都執行的現象叫——併發,但是不是絕對意義上的“同時”。

2. 建立一個執行緒

    1)Thread 類:執行緒包含一個可以執行的過程(方法),Thread 類中包含方法run()

    2)建立一個具體執行緒,需要繼承於 Thread 類

    3)覆蓋 run() 方法(就是更新執行過程),實現使用者自己的過程。

    4)建立執行緒例項(一個執行緒)。

    5)使用執行緒例項的 start() 方法啟動執行緒,啟動以後執行緒會盡快的去併發執行 run() 。

3. 執行緒的狀態

    1)new新建

    2)runnable  可執行(就緒)

    3)running  執行(正在執行)

    4)block  阻塞、掛起

    5)dead  死亡

4. 執行緒狀態管理

    1)讓出 CPU

          Thread.yield() 當前執行緒讓出處理器(離開 running),使當前執行緒進入 runnable 等待。

    2)休眠

          Thread.sleep(times) 使當前執行緒從 running 放棄處理器進入 block 狀態,休眠 times 毫秒,再返回到 runnable,如果其他執行緒打斷當前執行緒的block(sleep),就會發生InterruptedException

5. 執行緒的常用屬性

    1)執行緒的優先順序(資源緊張時候,儘可能優先)

          t.setPriority(Thread.MAX_PRIORITY);

          預設有 10 優先順序,優先順序高的執行緒獲得執行的機會多。

          機會的多少不能通過程式碼干預。

          預設優先順序是 5。

    2)後臺執行緒(守護執行緒,精靈執行緒)

           t.setDaemon(true);

          Java 程序的結束:當前所有前臺執行緒都結束時,Java 程序結束後臺執行緒,不管是否結束,都被停掉!

    3)執行緒名字

          getName();

    4)當前執行緒

          Thread main = Thread.currentThread();

6. 建立執行緒的兩種方式

    1)繼承 Thread 類

          1  繼承 Thread 類,覆蓋 run() 方法,提供併發運程的過程。

          2  建立這個類的例項。

          3  使用 start() 方法啟動執行緒。

    2)實現 Runnable 介面

          1  實現 Runnable 介面,重寫 run() 方法,提供併發運程的過程。

          2  建立這個類的例項,用這個例項作為 Thread 構造器引數,建立 Thread 類。

          3  使用 start() 方法啟動執行緒。

class Person implements Runnable{
public void run(){
//...
}
}
Thread t = new Thread(new Person());
t.start();

    3)使用 內部類/匿名類 建立執行緒

new Thread(){
public void run(){
System.out.println("Hi Thread");
}
}.start();

7. Sleep 的打斷喚醒

    1)Thread.sleep(times) 使當前執行緒從 running 放棄處理器進入 block 狀態,休眠 times 毫秒,再返回到 runnable。

    2)一個執行緒可以提前喚醒另外一個 sleep block 的執行緒,interrupt()打斷/中斷。

    3)被喚醒執行緒出現 中斷異常

8. 非同步,同步

    1)非同步:併發,各幹自動的,如:一群人上卡車。

    2)同步:步調一致的處理,如:一群人上公交車。

9. 執行緒併發安全問題

    1)多個執行緒併發讀寫同一個臨界資源時候會發生“執行緒併發安全問題”。

    2)常見的臨界資源:

          多執行緒共享例項變數

          靜態公共變數

    3)使用同步程式碼塊解決執行緒併發安全問題

          synchronized(同步監視器){

          }

          1  同步監視器 是一個任意物件例項,是一個多個執行緒之間的互斥的鎖機制,多個執行緒要使用同一個“監視器”物件,實現同步互斥。  

          2  常見寫法:

          synchronized(this){

          }

          3  如果方法的全部過程需要同步,可以簡單使用 synchronized 修飾方法,相當於整個方法的 synchronized(this)。

          4  儘量減少同步範圍,提高併發效率。

10. Java 中同步的 API

       StringBuffer , Vector 和 Hashtable 是同步的,StringBuilder,ArrayList 和 HashMap 不是同步的。

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------