20175218 2018-2019-2 《Java程序設計》第十週學習總結
教材學習內容總結
- 第十二章主要講的是Java多線程機制,主要內容包括:Java中的線程,Thread類與線程的建立,線程的經常使用方法,線程同步,協調同步的線程,線程聯合,GUI線程以及計時器線程。
- 程序是一段靜態的代碼,它是應用軟件執行的藍本。而進程是程序的一次動態執行過程,它對應了從代碼加載、執行至執行完畢的一個完整過程,這個過程也是進程自己從產生、發展至消亡的過程。
- 線程是比進程更小的執行單位,一個進程在其執行過程當中,能夠產生多個線程,造成多條執行線索,每條線索,即每一個線程也有它自身的產生、存在和消亡的過程。
- 每一個Java應用程序都有一個缺省的主線程。當JVM(Java Virtual Machine 虛擬機)加載代碼,發現main方法以後,就會啓動一個線程,這個線程稱爲「主線程」(main線程),該線程負責執行main方法。JVM一直要等到Java應用程序中的全部線程都結束以後,才結束Java應用程序 。
- 建的線程在它的一個完整的生命週期中一般要經歷以下的四種狀態:
- 新建: 當一個Thread類或其子類的對象被聲明並建立時,新生的線程對象處於新建狀態。
- 運行 :線程必須調用start()方法(從父類繼承的方法)通知JVM,這樣JVM就會知道又有一個新一個線程排隊等候切換了。一旦輪到它來享用CPU資源時,此線程的就能夠脫離建立它的主線程獨立開始本身的生命週期了。
- 中斷:有4種緣由的中斷:
- JVM將CPU資源從當前線程切換給其餘線程,使本線程讓出CPU的使用權處於中斷狀態。
- 線程使用CPU資源期間,執行了sleep(int millsecond)方法,使當前線程進入休眠狀。
- 線程使用CPU資源期間,執行了wait()方法。
- 線程使用CPU資源期間,執行某個操做進入阻塞狀態。
- 死亡 :處於死亡狀態的線程不具備繼續運行的能力。線程釋放了實體。
- Java調度器的任務是使高優先級的線程能始終運行,一旦時間片有空閒,則使具備同等優先級的線程以輪流的方式順序使用時間片。
- 在編寫Thread類的子類時,須要重寫父類的run()方法,其目的是規定線程的具體操做,不然線程就什麼也不作,由於父類的run()方法中沒有任何操做語句。
- 在建立線程對象時必須向構造方法的參數傳遞一個實現Runnable接口類的實例,該實例對象稱做所創線程的目標對象,當線程調用start()方法後,一旦輪到它來享用CPU資源,目標對象就會自動調用接口中的run()方法(接口回調)。
- 從對象和對象之間的關係角度上看,目標對象和線程的關係有如下兩種情景。
- 目標對象和線程徹底解耦
- 目標對象沒有組合線程對象.目標對象常常須要經過得到線程的名字(由於沒法得到線程對象的引用)以便肯定是哪一個線程正在佔用CPU資源,即被JVM正在執行的線程。
- 目標對象組合線程(弱耦合)
- 目標對象能夠組合線程.目標對象類組合線程對象時, 目標對象能夠經過得到線程對象的引用。
- 在處理多線程問題時,咱們必須注意這樣一個問題:當兩個或多個線程同時訪問同一個變量,而且一個線程須要修改這個變量。咱們應對這樣的問題做出處理。在處理線程同步時,要作的第一件事就是要把修改數據的方法用關鍵字synchronized來修飾。所謂線程同步就是若干個線程都須要使用一個synchronized修飾的方法。
- 一個線程A在佔有CPU資源期間,可讓其它線程調用join()和本線程聯合,稱A在運行期間聯合了B。若是線程A在佔有CPU資源期間一旦聯合B線程,那麼A線程將馬上中斷執行,一直等到它聯合的線程B執行完畢,A線程再從新排隊等待CPU資源,以便恢復執行。若是A準備聯合的B線程已經結束,那麼B.join()不會產生任何效果。
- 計時器每隔a 毫秒「震鈴」一次,參數b是計時器的監視器。計時器發生的震鈴事件是ActinEvent類型事件。當震鈴事件發生時,監視器就會監視到這個事件,監視器就回調ActionListener接口中的actionPerformed(ActionEvent e)方法。使用Timer類的方法start()啓動計時器,即啓動線程。使用Timer類的方法stop()中止計時器,即掛起線程,使用restart()從新啓動計時器,即恢復線程。
教材學習中的問題和解決過程
代碼調試中的問題和解決過程
- 問題1:不清楚Thread的使用
- 問題1解決方案:
- 線程簡單實現的三種方式
- (1)第一種建立線程的方式是直接extends Thread 覆蓋run()方法便可。
- (2)第二種實現的方式是實現Runnable接口,實現run()方法。
- (3)第三種方式是 implements Callable,實現call()方法能夠獲得線程的執行結果;代碼不在寫。
上週考試錯題總結
- 關於 Connection 的描述,何者正確?
- A .能夠從 DriverManager 上取得 Connection
- B .能夠從 DataSource 上取得 Connection
- C .在方法結束以後 Connection 會自動關閉
- D .Connection 是線程安全( Thread-safe)
- 錯選:C
- 正解:AB
- 錯因:審題錯誤,選成錯誤的了
- 使用 Statement 來執行 SELECT 等查詢用的 SQL 指令時,應使用下列哪一個方法?
- A .executeSQL()
- B .executeQuery()
- C .executeUpdate()
- D .executeFind()
- 錯選:A
- 正解:B
- 錯因:對於 SQL 的一些用法記得不夠清楚
- 哪些 JDBC 驅動程序能夠有跨平臺的特性?
- A .TYPE 1
- B .TYPE 2
- C .TYPE 3
- D .TYPE 4
- 錯選:ABCD
- 正解:CD
- 錯因:對 JDBC 驅動理解不夠透徹
結對及互評
評分標準
- 正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
- 模板中的要素齊全(加1分)
- 缺乏「教材學習中的問題和解決過程」的不加分
- 缺乏「代碼調試中的問題和解決過程」的不加分
- 代碼託管不能打開的不加分
- 缺乏「結對及互評」的不能打開的不加分
- 缺乏「上週考試錯題總結」的不能加分
- 缺乏「進度條」的不能加分
- 缺乏「參考資料」的不能加分
教材學習中的問題和解決過程, 一個問題加1分java
代碼調試中的問題和解決過程, 一個問題加1分git
- 本週有效代碼超過300分行的(加2分)
- 其餘加分:
- 週五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進狀況的加1分
- 有動手寫新代碼的加1分
- 課後選擇題有驗證的加1分
- 代碼Commit Message規範的加1分
- 錯題學習深刻的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
- 結對學習狀況真實可信的加1分
- 扣分:
- 有抄襲的扣至0分
- 代碼做弊的扣至0分
- 遲交做業的扣至0分
點評過的同窗博客和代碼
其餘(感悟、思考等,可選)
對第六週的測試題進行了總結分析:
博客連接多線程
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
|
第一週 |
200/200 |
1/1 |
24/24 |
|
第二週 |
400/600 |
1/2 |
15/39 |
|
第三週 |
600/1200 |
1/3 |
18/57 |
|
第四周 |
700/1900 |
1/4 |
18/75 |
|
第五週 |
800/2700 |
5/9 |
18/93 |
|
第六週 |
800/3500 |
3/12 |
28/121 |
|
第七週 |
800/4300 |
3/15 |
18/139 |
|
第八週 |
900/5200 |
5/20 |
26/165 |
|
第九周 |
900/6100 |
4/24 |
24/189 |
|
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。學習
參考:軟件工程軟件的估計爲何這麼難,軟件工程 估計方法測試
計劃學習時間:28小時線程
實際學習時間:29小時設計
改進狀況:調試
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)
參考資料