不管多執行緒的挑戰仍然被使用的原因,是因為多執行緒仍然有幾個益處,這些益處中的一些是:
#更好的資源利用
想像一個應用程式讀取和處理來自於本機檔案系統的檔案。讓我們說從磁碟中讀取一個文件花費5秒鐘,處理它花費2秒鐘,執行兩個文件將會花費:#
5 seconds reading file A 2 seconds processing file A 5 seconds reading file B 2 seconds processing file B ----------------------- 14 seconds total
當從磁碟中讀文件的時候,大部分的CPU時間都花了在等待文件讀取上。在那個時間CPU是相當空閒的。它可以做一些其他的事情。透過改變這個操作的順序,CPU可以被更好的利用。看看這個順序:
5 seconds reading file A 5 seconds reading file B + 2 seconds processing file A 2 seconds processing file B ----------------------- 12 seconds total
CPU等待第一個檔案被讀取。然後它開始讀取第二個檔案。當第二個檔案正在讀取的時候,這個CPU執行第一個檔案。記住,當等待檔案從磁碟讀取的時候,這個CPU大部分時間是空閒的。
更簡單的程式設計
如果你正在單執行緒應用中手工的編寫上面的讀取和處理文件的順序的程序,你將不得不追蹤每一個檔案的讀取和處理的狀態。取代的,你可以啟動兩個線程,每一個線程都只是讀取和處理一個單獨的檔案。這些線程中的每一個當等待磁碟讀取檔案的時候都會被堵塞。當等待的時候,其他的線程可以使用CPU去處理他們已經讀到的文件的部分。這個結果就是磁碟將會一致保持忙碌狀態,讀取各種各樣的檔案進入記憶體。這個結果就是更好的利用了磁碟和CPU。它也會更簡單的去寫程序,因為一個執行緒只是追蹤一個單獨的檔案。更快回應的程式
另外一個公共的目標就是將一個單執行緒的應用程式轉換成多執行緒的應用程式將會獲得一個更快響應的應用程式。想像一個伺服器應用,它正在監聽進來請求的一些連接埠。當一個請求接收到了之後,他處理這個請求,然後再返回去監聽。這個伺服器循環概述如下:while(server is active){ listen for request process request }
如果這個請求花費很長時間去處理,在那段時間中沒有新的客戶端發送請求到伺服器。只有伺服器可以監聽接收的請求。
while(server is active){ listen for request hand request to worker thread }
這個方式,伺服器執行緒將會很快回到監聽器。因此更多的客戶端可以發送請求到伺服器。這伺服器變得更快的回應了。
#