閱讀955 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java並發/多線程教程——2多線程的優點

本係列譯自jakob jenkov的Java並發多線程教程,個人覺得很有收獲。由於個人水平有限,不對之處還望矯正!

盡管多線程有諸多的挑戰,但是多線程被廣泛使用的原因有以下幾點:
    1、對資源的充分利用
    2、簡化程序設計
    3、響應的及時性


資源的充分利用
    假設一個應用程序從本地文件係統中讀取並處理一個文件,讓我們來假設從硬盤讀取文件需要5秒,處理文件需要兩秒,那麼處理兩個文件則需要:
        5秒 讀取A文件
        2秒 處理A文件
        5秒 讀取B文件
        2秒 處理B文件
        共需14秒

    當從硬盤讀取文件的時候,CPU大部分時間用在等待從硬盤讀取數據,CPU 在等待的這段時間是非常空閑的,是可以被利用來做其他事情的,通過改變執行順序,CPU 可以被更好的利用。看下麵的執行順序:
        5秒 讀取A文件
        5秒 讀取B文件+2秒處理A文件
        2秒 處理B文件
        共需12秒

    到CPU等待A文件讀取的時候,開始讀取B文件,當B文件正在讀取的時候,CPU 開始處理A文件,記住,當CPU 等待從硬盤讀取文件的時候,CPU 幾乎是空閑的。

    通常,CPU 在等待IO操作時,可以做其他的事情的,不光是磁盤IO,網絡IO也是一樣的


簡化程序設計
    如果你打算用一個單線程的程序去處理上麵的問題,你不得不時刻跟蹤每個文件的讀取和處理狀態。而用多線程,你隻需要啟動兩個線程,而每個線程隻需負責單個文件讀取和處理。這些線程會被blocked當等待從磁盤上讀取文件,在等待的同時,另外的線程可以利用CPU 來處理它已經讀到的數據,這樣做的結果就是,磁盤一直處於繁忙的狀態,不斷地從磁盤讀取數據到內存中。這樣做,對於磁盤和CPU 的利用率得到提升,同時對於程序來說也更簡單,因為每個線程隻需去跟蹤一個文件的讀取和處理狀態


響應的及時性
    將單線程轉變為多線程的另一個目的是更具有響應的及時性。假設一個服務端程程序在一個端口上監聽請求,當收到請求後,它對這個請求進行相應的處理,然後再返回去監聽另外的請求。服務端程序如下:

    while(server is active){

        listen for the request

        process request

    }

    如果這個請求花費了很長的時間去處理,那麼客戶端就不能在此期間發送任何請求到服務端,隻有當服務端處理完當前請求再次回到監聽時才能接受新的請求。另一種設計是監聽線程把接受到的請求交給工作線程(work  thread )然後立即返回監聽。工作線程會對請求進行處理,並對客戶端返回一個結果。這種設計模式如下:

    while(server is active){

        listen for request

        handle request to work thread

    }

    這種方式,監聽線程會很快繼續進行監聽,因此更多的客戶端可以發送更多的請求到服務端,服務端也變的更具響應性。這對桌麵應用程序也是一樣的。

最後更新:2017-06-25 22:35:25

  上一篇:go  BP算法雙向傳,鏈式求導最難纏(深度學習入門係列之八)
  下一篇:go  標題