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