盛琳陽 盛芳圓
摘要:多線程技術是Java高級程序語言解決并發處理問題的解決方案,被廣泛應用于具有網絡通信功能的軟件開發工作。本文分析了線程之間通信的原理,介紹了Java多線程技術實現網絡通信的原理,指出了Java多線程技術實現線程安全及同步控制的有效途徑,提出了基于Java多線程技術的網絡通信系統實現方法改進方案。
關鍵詞:Java高級程序語言;多線程技術;網絡通信系統
中圖分類號:TP311 文獻標識碼:A 文章編號:1007-9416(2019)08-0108-01
1 線程之間通信的原理
軟件程序進行資源分配和調度的基本單位被稱為進程,進程中一個單一順序的控制流被稱為線程,線程是操作系統能夠進行運算調度的最小單位。進程與線程之間的區別就在于進程有獨立的存儲空間,而線程之間要共享同一個存儲空間。一個軟件程序在運行時需要有多個線程同時存在,則稱其具有多線程特性。在多線程場景下各線程共享CPU和內存,會出現線程的資源使用和存儲空間沖突的情況,如線程同步問題、線程牽制問題等。
多線程技術對線程的管理,就是讓線程之間共享資源,通過程序干預來控制線程的執行,在必要時刻還要干擾線程獲取資源來實現系統的共享資源異步訪問機制。多線程實現了線程的資源異步訪問,也實現了線程之間的通信和執行排序任務。
2 Java多線程技術實現網絡通信的原理
網絡通信系統一般分為服務器和客戶端兩個組件。早期的服務器端口只能和一個客戶端進行通信,當前一個通信未完成時后續訪問都處于等待狀態,只有關閉端口重新連接才能進行新的線程通信。隨著程序設計語言的不斷發展和網絡環境的不斷優化,網絡通信系統都具備了多服務器和多客戶端相互訪問的能力。在解決網絡通信問題時就需要多線程技術的支持。
Java的多線程技術支持線程共享存儲空間的機制,并且實現了不同線程之間的信息同步與交流,即網絡通信。Java語言處理多線程問題的步驟如下:(1)對處理多線程的條件指令進行校驗判斷,只有在校驗通過的情況下才可以讓后續的線程繼續執行;(2)當某一個線程指令完成后,要通知條件指令進行二次校驗,滿足條件后讓其他線程繼續執行;(3)執行上述兩個步驟,讓線程不斷循環執行下去,實現了不間斷的網絡通信功能。
3 Java多線程技術實現線程安全及同步控制
多線程編程會遇到最大的挑戰就是線程安全和同步控制問題。線程安全是指線程并行執行時出現的數據和執行問題,比如線程A在進行集合的遍歷查詢,線程B則在進行集合的清空操作,這兩個線程A和B如果同時進行會出現問題,誰先執行也會對對方的正常執行造成影響。同步控制是指在線程A操作數據時通知其他線程無法獲得當前數據,只有線程A完成后其它線程才可以進行訪問。Java多線程技術實現線程安全及同步控制的和新方法有synchronized同步鎖、wait/notify等待/通知機制、信號量機制等。(1)synchronized 同步鎖。Java使用synchronized關鍵字來實現線程同步鎖機制,線程可以使用synchronized來申請資源鎖定,別的線程在訪問帶有synchronized關鍵字的資源時就會自動進入等待狀態。當持有synchronized鎖的線程完成操作后,可以釋放同步鎖讓其他線程繼續訪問系統資源。(2)wait/notify等待/通知機制。在處理線程數量較大,彼此之間頻繁通信的多線程場景下,可以使用喚醒等待機制來實現網絡通信功能。Java中的wait/notify2個方法就實現了線程的等待通知機制。wait/notify指令要在synchronized 同步鎖的基礎上執行。對于獲得synchronized 同步鎖的線程,如果在執行過程中需要等待,可以調用wait方法來進入堵塞隊列,與此同時synchronized 鎖也會失效,其他線程開始獲得同步鎖進行處理,處理完成后調用notify方法來歸還synchronized 同步鎖。當堵塞隊列中有較多線程排隊時,調用了notify方法的線程會隨機通知一個等待線程進行激活,也可以調用notifyAll方法來通知所有等待的線程,得到通知的線程會進入就緒隊列進行后續處理。
4 Java多線程實現通信編程
Socket是Java多線程技術的主要類實現,網絡通信編程又稱為Socket編程。Socket編程基于TCP網絡西醫,分別實現服務器和客戶端。調用ServerSocket來構建服務器線程,為服務器設置固定的IP和端口號;多個客戶端程序可以借助Socket實現與服務器的通信和交互,連接結束后服務器還會創建一個Socket對象來記錄該次連接。Java多線程實現通信編程的過程如下:(1)網絡通信系統服務器端實現。創建服務對象ServerSocket創建服務器對象,讓服務器線程等待客戶端請求,并返回一個代表本次連接的Socket對象。ServerSocket對象的主要方法有:新建對象,讓更多的連接進行定義;按照一定規則構建數據交換機制,記錄各個線程的輸入輸出情況;關閉連接和其他系統資源。(2)網絡通信系統客戶端實現。服務器端進入等待狀態后,可以初始化Socket對象來向服務器端發送請求連接申請,獲得申請許可后則按照一定規則進行數據交互,完成連接和操作后也要進行客戶端的連接關閉實現。
5 Java多線程實現網絡通信系統的改進思路
傳統的網絡通信系統的服務器程序只能完成一次讀取操作,當Socket對象生成并完成請求應答后,在進行后續請求就要斷開重連,否則就會對系統服務器造成較大性能影響。為了解決這一問題,可以使用無限循環語句while(true)來實現服務器端的反復進行,但由于程序完成一次信息讀取后就會進入等待狀態,再使用無限循環語句也不會有什么實際的意義。為了解決無限循環鎖死的問題,使用現成技術手段讓服務器在循環內讀取Socket信息。具體方法就是在服務器結構中加入內部類ReadMessageThread,實現多客戶端訪問服務器的安全和同步管控。