轉自新浪博客,來自百度搜索。html
原做者:2016-03-30 IBM劉欣 程序猿算法
我是一個線程, 我一出生就被編了個號: 0x3704, 而後被領到一個昏暗的屋子裏, 這裏我發現了不少和我如出一轍的同伴。我身邊的同伴0x6900 待的時間比較長, 他帶着滄桑的口氣對我說:咱們線程的宿命就是處理包裹。 把包裹處理完之後還得立刻回到這裏,不然可能永遠回不來了。我一臉懵懂,包裹,什麼包裹?」不要着急,立刻你就會明白了, 咱們這裏是不養閒人的。「數據庫
果真,沒多久,屋子的門開了, 一個面貌兇惡的傢伙吼道: "0x3704 ,出來!"我一出來就被塞了一個沉甸甸的包裹,上面還有附帶着一個寫滿了操做步驟的紙。 "快去,把這個包裹處理了。""去哪兒處理""跟着指示走, 先到就緒車間"果真,地上有指示箭頭,跟着它來到了一間明亮的大屋子,這裏已經有很多線程了, 你們都很緊張,好像時刻準備着往前衝。緩存
我剛一進來,就聽見廣播說:「0x3704, 進入車間」我趕忙往前走, 身後不少人議論說:」他太幸運了, 剛進入就緒狀態就能運行「」是否是有關係?「 」不是,你看人家的優先級多高啊, 唉「前邊就是車間, 這裏簡直是太美了, 怪不得老線程老是嘮叨着說:要是能一直待在這裏就行了。 這裏空間大,視野好,空氣清新,鳥語花香,還有不少歷來沒見過的人,像服務員同樣等着爲我服務。 他們也都有編號, 更重要的是每一個人還有個標籤,上面寫着:硬盤,數據庫,內存,網卡...我如今理解不了,看看操做步驟吧:第一步:從包裹中取出參數 打開包裹, 裏邊有個HttpRequest 對象, 能夠取到 userName, password兩個參數;第二步:執行登陸操做。奧,原來是有人要登陸啊,我把userName/password 交給 數據庫服務員,他拿着數據, 慢騰騰的走了。 他怎麼這麼慢? 不過我是否是正好能夠在車間裏多待一下子? 反正也無法執行第三步。就在這時,車間裏的廣播響了: "0x3704, 我是CPU , 記住你正在執行的步驟, 立刻帶包裹離開"。我慢騰騰的開始收拾,」快點, 別的線程立刻就要進來了「。網絡
離開這個車間, 又來到一個大屋子,這裏不少線程慢騰騰的在喝茶,打牌。」哥們,大家沒事幹了?「。」你新來的把, 你不知道我在等數據庫服務員給我數據啊!聽說他們比咱們慢好幾十萬倍, 在這裏好好歇吧「 」啊? 這麼慢? 我這裏有人在登陸系統, 能等這麼長時間嗎" 」放心,你沒據說過人間一天, CPU一年嗎, 咱們這裏是用納秒,毫秒計時的, 人間等待一秒,至關於咱們好幾天呢, 來的及「。多線程
乾脆睡一會吧 , 不知道過了多久 ,大喇叭又開始廣播了:"0x3704, 你的數據來了,快去執行」我轉身就往CPU車間跑,發現這裏的線程們只出不進!後面傳來陣陣鬨笑聲:」果真是新人, 不知道還得去就緒車間等「因而趕忙到就緒車間, 此次沒有那麼好運了, 等了很久才被再次叫進CPU車間。在等待的時候, 我聽見有人小聲議論:」據說了嗎,最近有個線程被kill掉了「」爲啥啊?「」這傢伙賴在CPU車間不走, 把CPU利用率一直搞成100%,後來就被kill掉了「 」Kill掉之後弄哪兒去了「 」可能被垃圾回收了吧「 我內心打了個寒噤。 趕忙接着處理, 剩下的動做快多了,第二步登陸成功了,第三步:構建登陸成功後的主頁。這一步有點費時間, 由於有不少HTML須要處理, 不知道代碼誰寫的,處理起來很煩人。我正在緊張的製做html呢, CPU又開始叫了:"0x3704, 我是CPU , 記住你正在執行的步驟, 立刻帶包裹離開"」爲啥啊「」每一個線程只能在CPU上運行一段時間,到了時間就得讓別人用了, 你去就緒車間待着, 等着叫你吧「 就這樣, 我一直在就緒-運行 這兩個狀態,不知道輪轉了多少次, 終於按照步驟清單把工做作完了。最後順利的把包含html的包裹發了回去。分佈式
至於登陸之後幹什麼事兒 , 我就無論了。 立刻就要回到我那昏暗的房間了, 真有點捨不得這裏。不過相對於有些線程, 我仍是幸運的, 他們運行完之後就完全的銷燬了,而我還活着!回到了小黑屋, 老線程0x6900 問:」怎麼樣?第一天有什麼感受?「 」咱們的世界規則很複雜 , 首先你不知道何時會被挑中執行; 第二 ,在執行的過程當中隨時可能被打斷,讓出CPU車間; 第三,一旦出現硬盤,數據庫這樣耗時的操做也得讓出CPU,去等待; 第四,就是數據來了,你也不必定立刻執行,還得等着CPU挑選「 」小夥子理解的不錯啊「 」我不明白爲何不少線程都執行完就死了, 爲何我們還活着?「 」你還不知道, 長生不總是咱們的特權, 咱們這裏有個正式的名稱,叫作線程池!「。網站
平淡的日子就這麼一每天過去, 做爲一個線程, 我天天的生活都是取包裹,處理包裹,而後回到咱們昏暗的家:線程池。有一天我回來的時候, 聽到有個兄弟說, 今天要好好休息下,明天就是最瘋狂的一天。 我看了一眼日曆,明天是 11月11號 。 果真,零點剛過,不知道那些人類怎麼了, 瘋狂的投遞包裹, 爲了應付蜂擁而至的海量包裹, 線程池裏沒有一我的能閒下來,所有出去處理包裹。CPU車間利用率超高,硬盤在嗡嗡轉, 網卡瘋狂的閃, 即使如此, 仍是處理不完,堆積如山。咱們也沒有辦法,實在是太多太多了, 這些包裹中大部分都是瀏覽頁面,下訂單,買,買,買。操作系統
不知道過了多久, 包裹山終於慢慢的消失了。終於可以喘口氣, 我想我永遠都不會忘記這一天。經過這個事件,我明白了我所處的世界:這是一個電子商務的網站!我天天的工做就是處理用戶的登陸,瀏覽, 購物車,下單,付款。我問線程池的元老0x6900 : " 咱們要工做到何時?" " 要一直等到系統重啓的那一刻", 0x6900 說。" 那你經歷過系統重啓嗎?" " 怎麼可能? , 系統重啓就是咱們的死亡時刻, 也就是世界末日,一旦重啓, 整個線程池所有銷燬,時間和空間所有消失,一切從頭再來」" 那何時會重啓?" " 這就很差說了,好好享受眼前的生活吧....."其實生活豐富多彩, 我最喜歡的包裹是上傳圖片,因爲網絡慢,因此能在就緒車間, CPU車間待很長很長時間,能夠認識不少好玩的線程。好比說上次認識了memecached 線程,他給我說經過他緩存了不少的用戶數據, 仍是分佈式的! 不少機器上都有!我說怪不得後來的登陸操做快了那麼多, 原來是再也不從數據庫取數據了你那裏就有啊, 哎對了你是分佈式的,你去過別的機器沒有?他說怎麼可能我每次也只能經過網絡往那個機器發送一個GET, PUT命令才存取數據而已, 別的一律不知。再好比說上次在等待的時候遇到了數據庫鏈接的線程, 我才知道它他那裏也是一個鏈接池, 和咱們線程池幾乎如出一轍。他說有些包裹太變態了,居然查看一年的訂單數據, 簡直把我累死了。我說拉倒吧你, 你那是純數據, 你把數據傳給我之後,我還得組裝成HTML, 工做量不知道比你大多少倍。他說必定你要和memecached搞好關係,直接從他那兒拿數據,儘可能少直接調用數據庫,咱們JDBC connection也能活的輕鬆點。我說好啊好啊, 關鍵是你得提早把數據搞到緩存啊, 要否則我先問一遍緩存, 沒有數據, 我這不還得找你嗎?生活就是這樣, 若是你本身不找點樂子,還有什麼意思?線程
有一天我遇到一個可怕的事情, 差一點死在外邊,回不了線程池了......其實此次遇險我應該可以預想到纔對, 太大意了。 前幾天我處理過一些從http 發來的存款和取款的包裹, 老線程0x6900 特地囑咐我:"處理這些包裹的時候要特別當心, 你得必定要先得到一把鎖, 在對帳戶存款或者取款的時候必定要把帳戶給鎖住, 要否則別的線程就會在你等待的時候趁虛而入,搞破壞, 我年輕那會兒很毛糙,就捅了簍子"。 爲了「恐嚇」我, 好心的0x6900還給了我兩個表格:一、沒有加鎖的狀況,二、加鎖的狀況。我看的膽顫心驚, 原來不加鎖會帶來這麼嚴重的事故。今後之後看到存款,取款的包裹就倍加當心, 還好,沒有出過事故。 今天我收到的一個包裹是轉帳, 從某著名演員的帳號給某著名導演轉錢, 具體是誰我就不透漏了, 數額可真是不小。我按照老線程的吩咐, 確定要加鎖啊, 先對著名演員帳號加鎖, 再對著名導演帳號加鎖。萬萬沒想到的是, 還有一個線程,對,就是0x7954, 居然同時在從這個導演給這個演員轉帳。 因而乎,就出現了這麼個狀況:剛開始我還不知道什麼狀況, 一直坐在等待車間傻等, 但是等的時間太長了, 長達幾十秒 ! 我可歷來沒有經歷過這樣的事件。 這時候我就看到了線程0x7954 , 他清閒的坐在那裏喝咖啡, 我和他聊了起來:「哥們, 我看你已經喝了8杯咖啡了, 怎麼還不去幹活?」「你不喝了9杯茶了嗎?」 0x7954 回敬到。「我在等一個鎖, 不知道哪一個孫子一直不釋放」「我也在等鎖啊,我要是知道哪一個孫子不釋放鎖我非揍死他不可 」 0x7954 絕不示弱。我偷偷的看了一眼, 這傢伙懷裏不就抱着我正在等的 某導演的鎖嘛?很明顯, 0x7954 也發現了我正抱着他正在等待的鎖。 很快咱們兩個就吵了起來, 各執己見:"把你的鎖先給我, 讓我先作完" "不行, 歷來都是作完工做才釋放鎖, 如今絕對不能給你"。
從爭吵到打起來, 就那麼幾秒鐘的事兒。 更重要的是, 咱們倆不只僅持有這個著名導演和演員的鎖, 還有不少其餘的鎖, 致使等待的線程愈來愈多, 圍觀的人們把屋子都擠滿了。最後事情真的鬧大了, 我歷來沒見過終極大boss "操做系統" 也來了。 大Boss畢竟是見多識廣, 他看了一眼, 哼了一聲 , 很不屑的說:"又出現死鎖了" "大家倆要Kill掉一個, 來吧, 過來抽籤 "這一會兒把我給嚇尿了, 這麼嚴重啊!我戰戰兢兢的抽了籤,打開一看, 是個"活"字。 唉,小命終於保住了。 可憐的0x7954 被迫交出了全部的資源之後, 很不幸的被kill掉, 消失了。我拿到了導演的鎖, 能夠開始幹活了。大Boss操做系統如一陣風似的消失了, 身後只傳來他的聲音:記住, 咱們這裏導演>演員, 不管任何狀況都要先得到導演的鎖。因爲不只僅是隻有導演和演員, 還有不少其餘人, Boss留下了一個表格, 裏邊是個算法, 用來計算資源的大小, 計算出來之後,永遠按照從大到小的方式來得到鎖:我回到線程池, 你們都知道了個人歷險, 圍着我問個不停。 凶神惡煞的線程調度員把大Boss的算法貼到了牆上。天天早上, 咱們都得像無節操的房屋中介, 美容美髮店的服務員同樣, 站在門口,像被耍猴同樣大聲背誦:"多個資源加鎖要牢記, 必定要按Boss的算法比大小, 而後從最大的開始加鎖"
又過了數日, 我和其餘線程們發現了一個奇怪的事情:包裹的處理愈來愈簡單,無論任何包裹,無論是登陸, 瀏覽,存錢..... 處理的步驟都是同樣的, 返回一個固定的html頁面。有一次我偷偷的看了一眼, 上面寫着:"本系統將於今晚 00:00 至4:00 進行維護升級, 給你帶來的不便咱們深感抱歉"。我去告訴了老線程0x6904, 他嘆了一口氣說:"唉, 咱們的生命也到頭了, 看來立刻就要重啓系統, 咱們就要消失了, 再見吧兄弟。"系統重啓的那一刻終於到來了。 我看到屋子裏的東西一個個的不見了, 等待車間,就緒車間,甚至CPU車間都慢慢的消失了。我身邊的線程兄弟也愈來愈少, 最後只剩我本身了。 我在空曠的原野上大喊: 還有人嗎?無人應DA。
咱們這一代線程池完成了使命。下一代線程池將很快重生。