我是一個線程, 我一出生就被編了個號: 0x3704, 而後被領到一個昏暗的屋子裏, 這裏我發現了不少和我如出一轍的同伴。html
我身邊的同伴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車間都慢慢的消失了。
我身邊的線程兄弟也愈來愈少, 最後只剩我本身了。
我在空曠的原野上大喊: 還有人嗎?
無人應答。
咱們這一代線程池完成了使命。
下一代線程池將很快重生。