1. 程式人生 > >20165230 2017-2018-2 《Java程序設計》第8周學習總結

20165230 2017-2018-2 《Java程序設計》第8周學習總結

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周學習總結