多線程的優(yōu)勢
盡管使用多線程有挑戰(zhàn),但是由于使用多線程也有很多好處,我們?nèi)匀皇褂枚嗑€程。這些優(yōu)勢(好處)是:
- 更好的資源利用率
- 在一些情景下更好的程序設(shè)計(jì)
- 更具有響應(yīng)性的程序
更好的資源利用率
想象有一個在文件系統(tǒng)中讀和處理文件的程序。如果從磁盤中讀一個文件需要使用5秒鐘,處理它需要使用2秒鐘。處理兩個文件就需要:
5秒鐘用于讀文件A
2秒鐘用于處理文件A
5秒鐘用于讀文件B
2秒鐘用于處理文件B
-------------------
共14秒
當(dāng)cpu從磁盤中讀文件的時候,大部分的cpu時間被用于等待文件被磁盤中讀出(讀入內(nèi)存)。cpu在這段時間其實(shí)是非??臻e的。它能夠做一些其他的事情。通過改變操作順序,cpu能夠被更好更有效率地利用??匆幌孪旅孢@個順序。
5秒鐘用于讀文件A
5秒鐘用于讀文件B+2秒鐘用于處理文件A
2秒鐘用于處理文件B
------------------
共12秒
cpu先等待讀第一個文件。然后他開始讀第二個文件。當(dāng)?shù)诙€文件正在被讀時,cpu處理了第一個文件。記住,當(dāng)cpu等待文件從磁盤中被讀出時,cpu大部分時間都是空閑的。
一般來說,當(dāng)cpu在等待IO的時候,cpu能夠做其他事情。不僅僅局限于磁盤IO。它也可以是網(wǎng)絡(luò)IO,或者也可以是用戶在機(jī)器上面的輸入。網(wǎng)絡(luò)和磁盤IO通常情況下要比cpu和內(nèi)存IO要慢很多。
簡單的程序設(shè)計(jì)
如果你曾經(jīng)在一個線程應(yīng)用中親手編寫過上述順序的讀、處理程序,你需要跟蹤(記錄)文件的讀和處理兩種狀態(tài)。除了這個方法,你也可以開啟兩個線程,每一個線程僅僅只對一個文件進(jìn)行讀和處理。每一個線程在等待磁盤讀指定的文件時,都會阻塞。當(dāng)一個線程等待時,其他線程可以利用cpu去處理其他已經(jīng)被讀入的文件部分。最后的結(jié)果是,磁盤一直保持忙碌狀態(tài),讀入大量的文件到內(nèi)存中。這種方法就可以有更高的利用率無論是對于磁盤還是CPU。而且這也容易去編程,因?yàn)槊恳粋€線程都只需要跟蹤單個文件即可。
更具有響應(yīng)性的程序
另一個常見的目標(biāo)用于轉(zhuǎn)換一個單線程應(yīng)用到多線程應(yīng)用是為了一個完成一個更多響應(yīng)的程序。想象一個監(jiān)聽著某些端口的服務(wù)端程序,服務(wù)于即將到來的請求。當(dāng)請求被接收了之后,他處理了請求然后返回去繼續(xù)監(jiān)聽。服務(wù)循環(huán)類似于下面這樣:
while(server is active){
listen for request
process request
}
如果請求需要很長時間來進(jìn)行處理,沒有新的客戶端能夠發(fā)送請求到服務(wù)器中在這段時間內(nèi)。僅僅只有服務(wù)器正在監(jiān)聽的時候,請求能夠被接收。
另一個可替代的設(shè)計(jì)可以是監(jiān)聽線程將請求傳遞給工作線程,然后立刻返回繼續(xù)監(jiān)聽。工作線程將會處理請求然后發(fā)送一個回復(fù)到客戶端。這個設(shè)計(jì)類似于下面這樣:
while(server is active){
listen for request
hand request to worker thread
}
通過這種方法,服務(wù)將會馬上返回繼續(xù)監(jiān)聽。這樣更多的客戶端能夠發(fā)送請求到服務(wù)端。服務(wù)端能夠變得更具有響應(yīng)性。
這種情況和桌面程序是一樣的。如果你點(diǎn)了一個按鈕引發(fā)了一個長時間的任務(wù),這個線程執(zhí)行的任務(wù)是更新窗口,按鈕和其他...但是當(dāng)這個任務(wù)執(zhí)行時,這個應(yīng)用將不會響應(yīng)。換一種方式,任務(wù)可以交給工作線程。當(dāng)工作線程忙于這個任務(wù)時,窗口線程能夠回應(yīng)其他用戶的請求。當(dāng)工作線程完成時,他會發(fā)送一個信號給窗口線程。這個窗口線程能夠用任務(wù)的結(jié)果來更新應(yīng)用的界面。這種帶有工作線程設(shè)計(jì)的程序變得更具有響應(yīng)性了。
ps:本人只是一個自學(xué)英語一段時間的初級程序猿。無論是英語翻譯程度,還是技術(shù)理解程度都遠(yuǎn)遠(yuǎn)不足,如果文中有翻譯不到位,或者技術(shù)理解錯誤情況,還請各位指出,必定改正,也可相互學(xué)習(xí)交流。