天天看點

Java基礎-多線程(一)

程式、程序與線程
  • 程式Program:程式是一段靜态的代碼,它是應用程式執行的藍本
  • 程序Process:程序是指一種正在運作的程式,有自己的位址空間
  • 程序的特點
    • 動态性
    • 并發性
    • 獨立性
  • 并發和并行的差別
    • 多個CPU同時執行多個任務
    • 一個CPU(采用時間片)同時執行多個任務
      Java基礎-多線程(一)
  • 線程Thread:程序内部的一個執行單元,它是程式中一個單一的順序控制流程。
  • 線程又被稱為輕量級程序(lightweight process)
  • 如果在一個程序中同時運作了多個線程,用來完成不同的工作,則稱之為多線程
  • 線程特點
    • 輕量級程序
    • 獨立排程的基本機關
    • 可并發執行
    • 共享程序資源
  • 線程和程序的差別
    Java基礎-多線程(一)
線程的建立
  • 方式1:繼承

    Java.lang.Thread

    類,并覆寫run() 方法
  • 方式2:實作

    Java.lang.Runnable

    接口,并實作run() 方法

備注:方法run( )稱為線程體。

線程的啟動
  • 建立的線程不會自動開始運作,必須通過start( )方法啟動
  • 不能直接調用run()來啟動線程,這樣run()将作為一個普通方法立即執行,執行完畢前其他線 程無法兵法執行
  • Java程式啟動時,會立刻建立主線程,main就是在這個線程上運作。當不再産生新線程時, 程式是單線程的
兩種線程建立方式的比較
  • 繼承Thread類方式的多線程
    • 優勢:編寫簡單
    • 劣勢:無法繼承其它父類
  • 實作Runnable接口方式的多線程
    • 優勢:可以繼承其它類,多線程可共享同一個Runnable對象
    • 劣勢:程式設計方式稍微複雜,如果需要通路目前線程,需要調用

      Thread.currentThread()

      方 法
Thread類常用方法
第三種方式:實作Callable接口
  • 與實行Runnable相比, Callable功能更強大些
  • 方法不同
    • 可以有傳回值,支援泛型的傳回值
    • 可以抛出異常
    • 需要借助FutureTask,比如擷取傳回結果
Future接口
  • 可以對具體Runnable、Callable任務的執行結果進行取消、查詢是否完成、擷取結果等。
  • FutrueTask是Futrue接口的唯一的實作類
  • FutureTask 同時實作了Runnable, Future接口。它既可以作為Runnable被線程執行,又可以作為 Future得到Callable的傳回值
線程的聲明周期
  • 新生狀态:
    • 用new關鍵字建立一個線程對象後,該線程對象就處于新生狀态。
    • 處于新生狀态的線程有自己的記憶體空間,通過調用start進入就緒狀态
  • 就緒狀态:
    • 處于就緒狀态線程具備了運作條件,但還沒配置設定到CPU,處于線程就緒隊列,等待系統為其配置設定CPU
    • 當系統標明一個等待執行的線程後,它就會從就緒狀态進入執行狀态,該動作稱之為“cpu排程”。
  • 運作狀态:
    • 在運作狀态的線程執行自己的run方法中代碼,直到等待某資源而阻塞或完成任務而死亡。
    • 如果在給定的時間片内沒有執行結束,就會被系統給換下來回到等待執行狀态。
  • 阻塞狀态:
    • 處于運作狀态的線程在某些情況下,如執行了sleep(睡眠)方法,或等待I/O裝置等資源,将讓出CPU并暫時停止自己的運作,進 入阻塞狀态。
    • 在阻塞狀态的線程不能進入就緒隊列。隻有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O裝置空閑下來,線程便轉入 就緒狀态,重新到就緒隊列中排隊等待,被系統選中後從原來停止的位置開始繼續運作。
  • 死亡狀态:
    • 死亡狀态是線程生命周期中的最後一個階段。線程死亡的原因有三個。一個是正常運作的線程完成了它的全部工作;另一個是線 程被強制性地終止,如通過執行stop方法來終止一個線程[不推薦使用】,三是線程抛出未捕獲的異常