20165315 第八周學習總結
阿新 • • 發佈:2018-04-22
join ive isalive 本周 什麽 java應用程序 開始 管理 程序
20165315 第八周學習總結
學習中遇到的問題和解決過程
- 在本周課堂測試,編寫“計算中東國家人口總數”時,反復檢查代碼的邏輯性後,卻一直輸出如下結果:
解決過程:
原來錯誤發生在我在if語句中比較字符串是否相同時,居然用了==
,而正確的應該用equals()
方法,這才讓程序找到了關鍵字,從而輸出了正確結果:
- 同樣是課堂測試,編寫“計算壽命最長和最短國家”的時候,輸出結果中壽命最長的國家是正確的,但是壽命最短的國家卻一直不對:
解決過程:
經過反復糾正,我發現在編寫過程中我犯了如下幾點錯誤:
- 沒有將壽命為0(即沒有壽命記錄)的國家去除
- 誤將計算壽命最長的國家和最短的國家放在了兩個while循環中
- 誤將
agemin
賦值為0,導致計算機發現沒有壽命比0小的國家
解決了上述問題後,輸出結果就正確了:
學習總結
第十二章
- 進程與線程
- 操作系統與進程
- 程序是一段靜態的代碼,它是應用軟件執行的藍本
- 進程是程序的一次動態執行過程,它對應了從代碼加載、執行至執行完畢的一個完整過程,這個過程也是進程本身從產生、發展至消亡的過程
- 現代操作系統可以同時管理一個計算機系統中的多個進程,即可以讓計算機系統中的多個進程輪流使用CPU資源
- 進程與線程
- 線程是比進程更小的執行單位,一個進程在其執行過程中,可以產生多個線程,形成多條執行線索,每條線索,即每個線程也有它自身的產生、存在和消亡的過程
- 線程間可以共享進程中的某些內存單元(包括代碼與數據),線程的中斷與恢復可以更加節省系統的開銷
- 操作系統與進程
- Java中的線程
- Java的多線程機制
- Java語言的一大特性點就是內置對多線程的支持
- Java虛擬機快速地把控制從一個線程切換到另一個線程。這些線程將被輪流執行,使得每個線程都有機會使用CPU資源
- 主線程(main線程)
- 每個Java應用程序都有一個缺省的主線程
- 當JVM(Java Virtual Machine 虛擬機)加載代碼,發現main方法之後,就會啟動一個線程,這個線程稱為“主線程”(main線程),該線程負責執行main方法
- JVM一直要等到Java應用程序中的所有線程都結束之後,才結束Java應用程序
- 線程的狀態與生命周期
- 建的線程在它的一個完整的生命周期中通常要經歷如下的四種狀態:
- 新建:
- 運行: 線程必須調用start()方法通知JVM,這樣JVM就會知道又有一個新一個線程排隊等候切換了。一旦輪到它來享用CPU資源時,此線程的就可以脫離創建它的主線程獨立開始自己的生命周期了
- 中斷: 有4種原因的中斷
- JVM將CPU資源從當前線程切換給其他線程,使本線程讓出CPU的使用權處於中斷狀態
- 線程使用CPU資源期間,執行了sleep(int millsecond)方法,使當前線程進入休眠狀
- 線程使用CPU資源期間,執行了wait()方法
- 線程使用CPU資源期間,執行某個操作進入阻塞狀態
- 死亡: 處於死亡狀態的線程不具有繼續運行的能力,線程釋放了實體
- 新建:
- 建的線程在它的一個完整的生命周期中通常要經歷如下的四種狀態:
- 線程調度與優先級
- Java虛擬機(JVM)中的線程調度器負責管理線程,調度器把線程的優先級分為10個級別,分別用Thread類中的類常量表示
- Java調度器的任務是使高優先級的線程能始終運行,一旦時間片有空閑,則使具有同等優先級的線程以輪流的方式順序使用時間片
- Java的多線程機制
- Thread類與線程的創建
- 在Java語言中,用Thread類或子類創建線程對象
- 使用Thread的子類
- 在編寫Thread類的子類時,需要重寫父類的run()方法,其目的是規定線程的具體操作,否則線程就什麽也不做,因為父類的run()方法中沒有任何操作語句
- 使用Thread類
- 創建線程的另一個途徑就是用Thread類直接創建線程對象:
Thread(Runnable target)
,該構造方法中的參數是一個Runnable類型的接口 - 在創建線程對象時必須向構造方法的參數傳遞一個實現Runnable接口類的實例,該實例對象稱作所創線程的目標對象,當線程調用start()方法後,一旦輪到它來享用CPU資源,目標對象就會自動調用接口中的run()方法(接口回調)
- 創建線程的另一個途徑就是用Thread類直接創建線程對象:
- 使用Thread的子類
- 目標對象與線程的關系
- 目標對象和線程完全解耦
- 目標對象沒有組合線程對象,目標對象經常需要通過獲得線程的名字以便確定是哪個線程正在占用CPU資源
- 目標對象組合線程(弱耦合)
- 目標對象可以組合線程,目標對象類組合線程對象時,目標對象可以通過獲得線程對象的引用
- 目標對象和線程完全解耦
- 關於run()方法啟動的次數
- 對於具有相同目標對象的線程,當其中一個線程享用CPU資源時,目標對象自動調用接口中的run方法,這時,run方法中的局部變量被分配內存空間,當輪到另一個線程享用CPU資源時,目標對象會再次調用接口中的run方法,run()方法中的局部變量會再次分配內存空間。即run()方法已經啟動運行了兩次,分別運行在不同的線程中
- 在Java語言中,用Thread類或子類創建線程對象
- 線程的常用方法
- 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資源
- 線程同步
- 在處理線程同步時,要做的第一件事就是要把修改數據的方法用關鍵字synchronized來修
- 所謂線程同步就是若幹個線程都需要使用一個synchronized修飾的方法
- 協調同步的線程
- wait()方法可以中斷方法的執行,使本線程等待,暫時讓出CPU的使用權,並允許其它線程使用這個同步方法
- notifyAll()方法通知所有的由於使用這個同步方法而處於等待的線程結束等待。曾中斷的線程就會從剛才的中斷處繼續執行這個同步方法,並遵循“先中斷先繼續”的原則
- notify()方法只是通知處於等待中的線程的某一個結束等待
- 線程聯合
- 一個線程A在占有CPU資源期間,可以讓其它線程調用join()和本線程聯合,如:
B.join();
,稱A在運行期間聯合了B。如果線程A在占有CPU資源期間一旦聯合B線程,那麽A線程將立刻中斷執行,一直等到它聯合的線程B執行完畢,A線程再重新排隊等待CPU資源,以便恢復執行。如果A準備聯合的B線程已經結束,那麽B.join()不會產生任何效果
- 一個線程A在占有CPU資源期間,可以讓其它線程調用join()和本線程聯合,如:
- 計時器線程
- 使用Timer類的方法start()啟動計時器,即啟動線程
- 使用Timer類的方法stop()停止計時器,即掛起線程
- 使用restart()重新啟動計時器,即恢復線程
- 使用
Timer(int a,Object b)
創建一個計時器,計時器每隔a毫秒“震鈴”一次,參數b是計時器的監視器。計時器發生的震鈴事件是ActinEvent類型事件。當震鈴事件發生時,監視器就會監視到這個事件,監視器就回調ActionListener接口中的actionPerformed(ActionEvent e)方法
- 守護線程
- 一個線程調用void setDaemon(boolean on)方法可以將自己設置成一個守護(Daemon)線程,例如:
thread.setDaemon(true);
- 當程序中的所有用戶線程都已結束運行時,即使守護線程的run方法中還有需要執行的語句,守護線程也立刻結束運行
- 一個線程調用void setDaemon(boolean on)方法可以將自己設置成一個守護(Daemon)線程,例如:
碼雲鏈接
https://gitee.com/BESTI-IS-JAVA-2018/ch1/tree/master/src/ch12
代碼截圖
20165315 第八周學習總結