多執行緒最多的場景:web伺服器本身;各種專用伺服器(如遊戲伺服器);
多執行緒的常見應用場景:
1、後台任務,例如:定時向大量(100w以上)的使用者傳送郵件;
2、非同步處理,例如:發微博、記錄日誌等;
3、分布式計算
多執行緒使用的主要目的在於:
1、吞吐量:你做web,容器幫你做了多執行緒,但是他只能幫你做請求層面的。簡單的說,可能就是乙個請求乙個執行緒。或多個請求乙個執行緒。如果是單執行緒,那同時只能處理乙個使用者的請求。
2、伸縮性:也就是說,你可以通過增加cpu核數來提公升效能。如果是單執行緒,那程式執行到死也就利用了單核,肯定沒辦法通過增加cpu核數來提公升效能。
鑑於你是做web的,第1點可能你幾乎不涉及。那這裡我就講第二點吧。
--舉個簡單的例子:
假設有個請求,這個請求服務端的處理需要執行3個很緩慢的io操作(比如資料庫查詢或檔案查詢),那麼正常的順序可能是(括號裡面代表執行時間):
a、讀取檔案1 (10ms)
b、處理1的資料(1ms)
c、讀取檔案2 (10ms)
d、處理2的資料(1ms)
e、讀取檔案3 (10ms)
f、處理3的資料(1ms)
g、整合1、2、3的資料結果 (1ms)
單執行緒總共就需要34ms。
那如果你在這個請求內,把ab、cd、ef分別分給3個執行緒去做,就只需要12ms了。
所以多執行緒不是沒怎麼用,而是,你平常要善於發現一些可優化的點。然後評估方案是否應該使用。
假設還是上面那個相同的問題:但是每個步驟的執行時間不一樣了。
a、讀取檔案1 (1ms)
b、處理1的資料(1ms)
c、讀取檔案2 (1ms)
d、處理2的資料(1ms)
e、讀取檔案3 (28ms)
f、處理3的資料(1ms)
g、整合1、2、3的資料結果 (1ms)
單執行緒總共就需要34ms。
如果還是按上面的劃分方案(上面方案和木桶原理一樣,耗時取決於最慢的那個執行緒的執行速度),在這個例子中是第三個執行緒,執行29ms。那麼最後這個請求耗時是30ms。比起不用單執行緒,就節省了4ms。但是有可能執行緒排程切換也要花費個1、2ms。因此,這個方案顯得優勢就不明顯了,還帶來程式複雜度提公升。不太值得。
那麼現在優化的點,就不是第乙個例子那樣的任務分割多執行緒完成。而是優化檔案3的讀取速度。
可能是採用快取和減少一些重複讀取。
首先,假設有一種情況,所有使用者都請求這個請求,那其實相當於所有使用者都需要讀取檔案3。那你想想,100個人進行了這個請求,相當於你花在讀取這個檔案上的時間就是28×100=2800ms了。那麼,如果你把檔案快取起來,那只要第乙個使用者的請求讀取了,第二個使用者不需要讀取了,從記憶體取是很快速的,可能1ms都不到。
偽**:
public class myservlet extends servlet
//process with data}}
看起來好像還不錯,建立乙個檔名和檔案資料的對映。如果讀取乙個map中已經存在的資料,那麼就不不用讀取檔案了。
可是問題在於,servlet是併發,上面會導致乙個很嚴重的問題,死迴圈。因為,hashmap在併發修改的時候,
可能是導致迴圈鍊錶的構成!!!(具體你可以自行閱讀hashmap原始碼)如果你沒接觸過多執行緒,可能到時候發現伺服器沒請求也
巨卡,也不知道什麼情況!
好的,那就用concurrenthashmap,正如他的名字一樣,他是乙個執行緒安全的hashmap,這樣能輕鬆解決問題。
public class myservlet extends servlet
//process with data}}
這樣真的解決問題了嗎,這樣雖然只要有使用者訪問過檔案a,那另乙個使用者想訪問檔案a,也會從filename2data中拿資料,
然後也不會引起死迴圈。
可是,你會發現,1000個使用者首次訪問同乙個檔案的時候,居然讀取了1000次檔案(這是最極端的,可能只有幾百)。
好好分析下。servlet是多執行緒的,那麼
public class myservlet extends servlet
//process with data}}
上面注釋的「偶然」,這是完全有可能的,因此,這樣做還是有問題。
因此,可以自己簡單的封裝乙個任務來處理。
public class myservlet extends servletelse
}string d = data.get();
//process with data
}private futuretask newfuturetask(final string file)
private string readfromfile(string file)}}
}以上所有**都是直接在bbs打出來的,不保證可以直接執行。
網路口碑推廣主要目的全知道
網際網路資訊經濟是新營銷模式產生的經濟環境。在資訊時代,由於資訊對價值創造的重要性越來越凸現,資訊本身也就成為有價值的產品和服務。企業不僅要能及時得到自己所需的準確資訊,還要把自己的資訊準確地發布給預定的目標物件。但不管企業採用的是 推式 還是 拉式 的資訊傳遞戰略,都還是單向 你聽我說 式的把自己...
linux主要目錄的作用
手動敲一遍 算是加強記憶吧 檔案系統的入口,也是最高一級的目錄 bin 最基本的且著急使用者和普通使用者都可以使用的命令放在此目錄下,如 ls cp等 boot 存放linux的核心及引導系統所需要的檔案,包括引導裝載程式 etc 存放系統配置檔案,一些伺服器的配置檔案也放在這裡 dev 存放所有的...
根目錄下的主要目錄功能
bin 二進位制可執行命令 dev 裝置特殊檔案 etc 系統管理和配置檔案 etc rc.d 啟動的配置檔案和指令碼 home 使用者主目錄的基點 lib 標準程式設計庫,又叫動態鏈結共享庫 sbin 系統管理命令,這裡存放的是系統管理員使用的管理程式 tmp 公用的臨時檔案儲存點 root 系統...