教材學習內容總結
第12章-JAVA多線程機制
要點
- Java中的線程
- Thread類與線程的創建
- 線程的常用方法
- 線程同步
- 協調同步的線程
- 線程聯合
- GUI線程
- 計時器線程
教材學習中的問題和解決過程
1. 進程與線程
- 程序:靜態的代碼,應用執行的藍本
- 進程:程序的一次動態的執行過程
- 線程:比進程更小的執行單位,一個進程可以產生多個線程;線程的終端與恢復能節省系統開銷;多線程的進程更實用
2. 主線程
- 即main線程,是JVM加載代碼,發現main方法后啟動的線程
- 當main方法返回時,JVM結束Java應用程序(虛擬機自動退出)
- JVM要等到Java程序中所有線程都結束后才結束Java應用程序
3. 線程的狀態與生命周期
Java語言使用Thread類及其子類的對象來表示線程
- 四種狀態
- 新建:一個Thread類或其子類的對象被聲明并創建,已經有了相應的內存空間和其他資源
- 運行:
- JVM將CPU使用權切換給該線程時,此線程就可以脫離創建它的主線程獨立開始自己的生命周期
- 線程創建后僅占有內存資源,必須調用start()方法(從父類處繼承的方法)通知JVM,告知新進程在排隊
- 程序必須在子類中重寫父類的run()方法,在線程沒有結束run()方法之前,不要讓線程再調用start()方法,否則將發生IllegalThreadStateException異常
- 中斷:四種中斷原因:
- JVM將CPU資源從當前線程切換給其他線程,使本線程讓出CPU的使用權處于中斷狀態
- 線程使用CPU資源期間,執行了sleep(int millsecond)方法,使當前線程進入休眠狀態
- 執行了wait()方法,使得當前線程進入等待狀態,必須由其他線程調用notify()方法通知它,使得它重新進到線程隊列中排隊等待CPU資源
- 執行某個操作進入阻塞狀態,比如執行讀/寫操作引起阻塞。只有當引起阻塞的原因消除時,線程才重新進到線程隊列中排隊等待CPU資源
- 死亡:線程結束后就不再具有繼續運行的能力,釋放掉分配給線程對象的內存。兩種死亡原因:
- run()方法正常執行完后結束
- run()方法被提前強制性地終止
4. 線程調度與優先級
- 沒有明確設置線程的優先級別,則優先級默認都是5,即
Thread.NORM_PRIORITY
- 線程優先級通過
setPriority(int grade)
方法調整,需要一個int型參數,且參數范圍在1~10內,即在Thread.MIN_PRIORITY
和Thread.MAX_PRIORITY
,若不再這個范圍內就拋出IllegalArgumenException
異常
5. Thread類與線程的創建
- Thread類
- 構造方法:
Thread(Runnable target)
- 參數:構造方法的參數是一個Runnable類型的接口
- 實例:要向參數傳遞一個Runnable接口類的實例
- 構造方法:
6. 線程常用方法
- start():線程調用該方法將啟動線程,使之從新建狀態進入就緒隊列排隊,一旦輪到它來享用CPU資源時,就可以脫離創建它的線程獨立開始自己的生命周期
- run():Thread類的run()方法與Runnable接口中的run()方法的功能和作用相同,都用來定義線程對象被調度之后所執行的操作,都是系統自動調用而用戶程序不得引用的方法
- sleep(int millsecond):優先級高的線程可以在它的run()方法中調用sleep方法來使自己放棄CPU資源,休眠一段時間
- isAlive():線程處于“新建”狀態時,線程調用isAlive()方法返回false。在線程的run()方法結束之前,即沒有進入死亡狀態之前,線程調用isAlive()方法返回true
- currentThread():該方法是Thread類中的類方法,可以用類名調用,該方法返回當前正在使用CPU資源的線程
- interrupt():一個占有CPU資源的線程可以讓休眠的線程調用interrupt()方法“吵醒”自己,即導致休眠的線程發生InterruptedException異常,從而結束休眠,重新排隊等待CPU資源
7. 協調同步的線程
- 線程同步:即若干個線程都需要使用一個synchronized修飾的方法.即程序中的若干個線程都需要使用一個方法,而這個方法用synchronized給予了修飾
- 同步方法:
wait()
、notify()
、notifyAll()
。都是Object類的final方法,被所有類繼承且不允許重寫 - 不可以在非同步方法中使用
wait()
、notify()
、notifyAll()
思考與感悟
本章了解了Java的另一大特點——線程。經過學習我了解到,掌握多線程編程技術就能充分利用CPU的資源,在實際問題中應用的更加廣泛、更加方便。
代碼托管
詳見碼云:碼云作業
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 3000行 | 30篇 | 400小時 | |
第八周 | 1324/200 | 2/11 | 20/20 | 深入 |
參考資料
- 教學視頻
- Intellj IDEA 簡易教程