程式、程序與線程
- 程式Program:程式是一段靜态的代碼,它是應用程式執行的藍本
- 程序Process:程序是指一種正在運作的程式,有自己的位址空間
- 程序的特點
- 動态性
- 并發性
- 獨立性
- 并發和并行的差別
- 多個CPU同時執行多個任務
- 一個CPU(采用時間片)同時執行多個任務
Java基礎-多線程(一)
- 線程Thread:程序内部的一個執行單元,它是程式中一個單一的順序控制流程。
- 線程又被稱為輕量級程序(lightweight process)
- 如果在一個程序中同時運作了多個線程,用來完成不同的工作,則稱之為多線程
- 線程特點
- 輕量級程序
- 獨立排程的基本機關
- 可并發執行
- 共享程序資源
- 線程和程序的差別
Java基礎-多線程(一)
線程的建立
- 方式1:繼承
類,并覆寫run() 方法Java.lang.Thread
- 方式2:實作
接口,并實作run() 方法Java.lang.Runnable
備注:方法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方法來終止一個線程[不推薦使用】,三是線程抛出未捕獲的異常