在學習多線程之前我們必須明白線程與進程的區別那麼現在我們就開始講理論知識點吧!
1. 線程與進程的區別?
進程是一個在正運行的獨立應用程序也可以理解爲線程的集合
線程可理解爲是進程中的一個執行路徑。
2. 那麼我們爲什麼要使用多線程?
爲了提高程序的效率。
3. 多線程得創建方式
3.1 第一種繼承Thread類
運行結果:
3.2 第二種實現Runnable接口
3.3 第三種使用匿名內部類創建
4.獲取線程的基本信息
API | |
start() | 啓動線程 |
currentThread() | 獲取當前線程的對象 |
getId() | 獲取當前線程id |
getName() | 獲取當前線程名稱 |
sleep(long mill) | 休眠線程 |
stop() | 停止線程 |
5.線程的生命週期
- 新生狀態:
使用 new 關鍵字和 Thread 類或其子類建立一個線程對象後,該線程對象就處於新建狀態。它保持這個狀態直到程序 start() 這個線程。
- 就緒狀態:
當線程對象調用了start()方法之後,該線程就進入就緒狀態。就緒狀態的線程處於就緒隊列中,要等待JVM裏線程調度器的調度。
- 運行狀態:
如果就緒狀態的線程獲取 CPU 資源,就可以執行 run(),此時線程便處於運行狀態。處於運行狀態的線程最爲複雜,它可以變爲阻塞狀態、就緒狀態和死亡狀態。
- 阻塞狀態:
如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所佔用資源之後,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得設備資源後可以重新進入就緒狀態。可以分爲三種:
等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。
同步阻塞:線程在獲取 synchronized 同步鎖失敗(因爲同步鎖被其他線程佔用)。
其他阻塞:通過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉入就緒狀態。
- 死亡狀態:
一個運行狀態的線程完成任務或者其他終止條件發生時,該線程就切換到終止狀