Java語言程序調試技巧與多線程問題

導語:Java是一種應用於互聯網的分佈式環境的編程語言。Java語言易於使用,而且在編程時採用“以對象爲導向”的方式。下面就由小編爲大家介紹一下Java語言程序調試技巧與多線程問題,歡迎大家閱讀!

Java語言程序調試技巧與多線程問題

  1 JaVa語言學習常見技巧

(1)勤動手:學編程語言要達到心領神會、融會貫通就必須勤動手。成功的軟件開發人員無不經過大量的上機鍛鍊,只有理論和實踐相結合才能真正掌握編程技能

(2)多動腦:對於Java語言的學習,建議從一開始就用面向對象的思維方式去面對你所接觸的每件事。

(3)閱讀API文檔:Java中的“類”用以滿足網絡化、多線程、面向對象的需要,它是Java編程過程中不斷利用的資源。Java的學習更多的是去學習和掌握它所提供的類庫。對於所接觸到的類、方法,需要仔細去閱讀文檔的說明,再用自己編寫的實例去驗證。

(4)規範編碼習慣:一個好的編程結構應該是能預防錯誤的發生,對錯誤的預見和錯誤出現以後的錯誤處理與異常處理的良好安排。經驗豐富的程序員,需要良好的編碼格式規範,而且程序中的邏輯實現要有一種良好的結構。

(5)定義有意義類名:養成爲每個類、每個方法起一個有意義的名字。在程序閱讀的過程中,看到這個名字就可以知道它要實現的功能。

(6)添加適量註釋:註釋提高程序的可讀性和可維護性。作爲一個軟件產品,其中不同的變量及方法可能很多,合理的註釋提高程序可讀性和維護性。

  2 Java程序調試常用技巧

程序調試,是將編制的程序投入實際運行前,用手工或編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程[1]。調試可以幫助識別和解決應用程序缺陷。

(1)先簡後繁:先使用一個boolean量,如:debugMode,需要看看程序的輸出時可以使用:if(debugMode)tln("..");在項目完畢後把debugMode變量設爲false。

(2)自頂向下:出現錯誤時,要逐步縮小可能出現錯誤的範圍,從整個程序到指定函數,再到指定行。如:Java-Ddebug=true MyClass,在使用這種方法時,必須在你所有的class中添加roperty("debug")來取得調試標誌,這樣在不更改source code的情況下可以直接修改Java程序調試標誌。當錯誤比較麻煩時,可以定義一個用於調試的類。這樣對於一個application(Test)可以進行調用:boolean debug=ystemDebug(applicationKey);

要打開Test的調試功能,只需:java g=true Test

當然這個類可以進行進一步擴展,比如將其變爲日誌管理,控制調試信息的輸出位置等

(3)設置斷點:斷點是程序運行中中斷的地方,旨在開發者在程序運行過程中查看程序當前的運行狀態。可以在測試時啓用斷言驗證,而在部署時禁用斷言驗證。a.條件斷點。加一個布爾條件,該斷點會被激活,條件爲真,就會執行該斷點,否則將會跳過往下執行。b.異常斷點。程序在遇到空指針異常(NullPointerException)時,添加一個異常斷點,可以繼續調試程序。

(4)單步執行程序:追蹤類裏面的方法體的整個執行過程,不需要設置斷點就可以停止一個GUI程序的執行。設置斷點後在調試器裏面開始執行程序,當碰到第一個斷點後,可以進入方法體或類體,也可以繼續運行直到下一個斷點或程序結束。

  3 Java應用程序常見多線程問題

Java編程語言的多線程簡單有效,比其他語言更容易實現。Java程序包括客戶端和服務器端。常見的多線程問題包括活鎖、死鎖、隱性死鎖和數據競爭。

(1)活鎖:當一個線程忙於接受新任務以致它永遠沒有機會完成任何任務時,就會發生活鎖。這個線程最終將超出緩衝區並導致程序崩潰。試想一個祕書需要錄入一封信,但她一直在忙於接電話,所以這封信永遠不會被錄入。

(2)死鎖。當一個線程需要一個資源而另一個線程持有該資源的鎖時,就會發生死鎖。如何發現問題並解決之。1)防止死鎖的方法是對競爭的資源引入序號,如果一個線程需要幾個資源,那麼它必須先得到小序號的資源,再申請大序號的資源。可以在Java代碼中增加同步關鍵字的使用,這樣可以減少死鎖,但這樣做也會影響性能。2)當進行嵌套的調用時,瞭解哪些調用使用了與其它調用同樣的數據庫連接。即使嵌套調用運行在同一個全局事務中,它仍將使用不同的數據庫連接,而不會導致嵌套死鎖。3)確保在峯值併發時有足夠大的資源池。4)避免執行數據庫調用或在佔有Java虛擬機鎖時,執行其他與Java虛擬機無關的操作。

(3)隱性死鎖:“佔有並等待”還可能引發一連串的線程等待,例如,線程A佔有線程B需要的鎖並等待,而線程B又佔有線程C需要的鎖並等待等。

(4)數據競爭:數據競爭是由於訪問共享資源時不適當地運用同步機制引起的。如果沒有正確地限定某一時刻某一個線程可以訪問變量,就會出現數據競爭,會導致不可預知的結果。由於線程的運行可以在任何時候被中斷(即運行機會被其它線程搶佔),所以不能假定先開始運行的線程總是比後開始運行的線程先訪問到兩者共享的數據。另外,在不同的vm上,線程的調度方式也可能不同,從而使數據競爭問題更加複雜。

多線程編程需要之前詳細設計系統,這樣能夠避免難以發現的死鎖的問題。死鎖在語言層面上不能解決,就需要一個良好設計來避免死鎖。