20165230 2017-2018-2 《Java程序設計》第8周學習總結
阿新 • • 發佈:2018-04-22
mage 教程 線程同步 永遠 數據庫服務器 進入 繼續 分享圖片 ID
20165230 2017-2018-2 《Java程序設計》第8周學習總結
教材學習內容總結
第十二章 java多線程機制
- 一個進程在其執行過程中,可產生多個線程。線程是比進程更小的執行單位
- JVM保證每個線程都有機會使用CPU資源,等到Java應用程序中的所有線程都結束後才結束應用程序
線程狀態與生命周期
- 使用
Thread
類及其子類的對象表示線程 - 調用
start()
方法將線程加入JVM管理隊列。調用以後不能再讓線程調用start()
方法 run()
方法規定了線程的具體使命。方法執行完畢後線程變成死亡狀態。
-sleep(int millsecond)
使線程進入休眠狀態。優先級高的線程可讓出CPU資源是優先級低的線程執行wait()
方法使線程進入等待狀態。通過notify()
方法使線程從中斷處繼續運行。通常將wait()
方法放入“while”的循環語句中
常用方法
isAlive()
用於判斷線程是否處於新建狀態或進入死亡狀態,若是,返回false.- 一個已經運行的線程在沒有進入死亡狀態時,不要再給線程分配實體
currentThread()
返回當前正在使用CPU資源的線程interrupt()
用來“吵醒”調用sleep()
方法休眠的線程Thread類與線程創建
- 編寫子類時,需要重寫
run()
方法 創建線程的構造方法:
Thread(Runnable target)
,參數是Runnable類型的接口,需向接口傳遞實例對象線程同步
- 線程同步機制:當一個線程使用
synchronized
方法時,其他線程若想使用就必須使用wait()
方法等待,直到該線程使用完該方法 - 其他線程在使用同步方法時若不需要等待,則用完方法的同時,執行
notifyAll()
方法通知所有處於等待狀態的線程結束等待 不可以在非同步方法中使用wait()、notify()、notifyAll()方法
線程聯合
B線程可通過
B.join()
聯合A線程。A線程將立刻中斷執行,等到B執行完畢後恢復執行GUI線程
- AWT-EventQuecue線程負責處理GUI事件
AWT-Windows線程負責將窗體或組件繪制到桌面
計時器線程
Timer(int a,Object b)
start()
啟動計時器stop()
停止計時器restart
重啟計時器守護線程
- 調用
void setDaemon(boolean on)
方法設置守護線程 一個線程必須在運行之前設置自己是否是守護線程
教材學習中的問題和解決過程
- 問題1:實現java多線程的兩種方法有什麽區別?
問題1解決:通過博客了解到
采用繼承Thread類方式:
- (1)優點:編寫簡單,如果需要訪問當前線程,無需使用Thread.currentThread()方法,直接使用this,即可獲得當前線程。
- (2)缺點:因為線程類已經繼承了Thread類,所以不能再繼承其他的父類。
- 采用實現Runnable接口方式:
- (1)優點:線程類只是實現了Runable接口,還可以繼承其他的類。在這種方式下,可以多個線程共享同一個目標對象,所以非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU代碼和數據分開,形成清晰的模型,較好地體現了面向對象的思想。
- (2)缺點:編程稍微復雜,如果需要訪問當前線程,必須使用Thread.currentThread()方法。
- 問題2:p377的代碼TicketHouse中為什麽把
wait()
改為Thread.sleep(3000)
,李逵永遠無法買票? 問題2解決:通過比較wait()方法和Thread()方法,了解到:
在調用sleep()方法的過程中,線程不會釋放對象鎖。
而當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法後本線程才進入對象鎖定池準備
獲取對象鎖進入運行狀態。
代碼調試中的問題和解決過程
- 問題1:在調試example12_3時,為什麽得到的結果是狗喝水剩7,貓喝水剩8?
- 問題1解決:通過學習教材視頻得知每個電腦的運行的結果不盡相同,輸出結果以來當前CPU資源的使用情況而定
上周考試錯題總結
錯題1
- select也是數據操作語言
錯題2
書上原話:“直接關閉MySQL數據庫服務器所占用的命令行窗口不能關閉MySQL數據庫服務器,可以使用任務管理器來關閉”
代碼托管
https://gitee.com/BESTI-IS-JAVA-2018/20165230/commit/5dd42538867b45b2b037b6d2039c2cf622fd26d9
代碼截圖
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 13/13 | 1/30 | 19/19 | |
第二周 | 426/426 | 3/30 | 12/12 | |
第三周 | 562/562 | 4/30 | 15/15 | |
第四周 | 1552/1958 | 5/30 | 16/16 | |
第五周 | 1123/3086 | 6/30 | 14/14 | |
第六周 | 747/3833 | 8/30 | 12/12 | |
第七周 | 953/4786 | 11/30 | 13/3 | |
第八周 | 4564/5881 | 13/30 | 14/14 |
參考資料
《Java2 實用教程(第五版)》學習指導
- java 多線程兩種方法的比較
java中的sleep()和wait()的區別
Intellj IDEA 簡易教程
20165230 2017-2018-2 《Java程序設計》第8周學習總結