第一回 初生牛犢html
我是一個線程,我一出生就被編了個號: 0x3704,而後被領到一個昏暗的屋子裏,在這裏我發現了不少和我如出一轍的同伴。算法
我身邊的同伴 0x6900 待的時間比較長,他帶着滄桑的口氣對我說:「咱們線程的宿命就是處理包裹。把包裹處理完之後還得立刻回到這裏,不然可能永遠回不來了。」數據庫
我一臉懵懂,「包裹,什麼包裹?」緩存
「不要着急,立刻你就會明白了,咱們這裏是不養閒人的。」網絡
果真,沒多久,屋子的門開了, 一個面貌兇惡的傢伙吼道:「0x3704 ,出來!」多線程
我一出來就被塞了一個沉甸甸的包裹,上面還附帶着一個寫滿了操做步驟的紙。 分佈式
「快去,把這個包裹處理了。」網站
「去哪兒處理?」spa
「跟着指示走,先到就緒車間。」操作系統
果真,地上有指示箭頭,跟着它來到了一間明亮的大屋子,這裏已經有很多線程了,你們都很緊張,好像時刻準備着往前衝。
我剛一進來,就聽見廣播說:「 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還給了我兩個表格:
(1)沒有加鎖的狀況
(2)加鎖的狀況
我看得膽顫心驚,原來不加鎖會帶來這麼嚴重的事故。今後之後看到存款、取款的包裹就倍加當心,還好沒有出過事故。
今天我收到的一個包裹是轉帳,從某著名演員的帳戶給某著名導演的帳戶轉錢,具體是誰我就不透漏了,數額可真是不小。
我按照老線程的吩咐,確定要加鎖啊,先對著名演員的帳戶加鎖,再對著名導演的帳戶加鎖。
可我萬萬沒想到的是,還有一個線程,對,就是0x7954, 居然同時在從這個導演的帳戶往這個演員的帳戶轉帳。
因而乎,就出現了這麼個狀況:
剛開始我還不知道什麼狀況,一直坐在等待車間傻等,但是等的時間太長了,長達幾十秒!我可歷來沒有經歷過這樣的事件。
這時候我就看到了線程0x7954 , 他清閒地坐在那裏喝咖啡,我和他聊了起來:
「哥們,我看你已經喝了8杯咖啡了,怎麼還不去幹活?」
「你不喝了9杯茶了嗎?」0x7954回敬道。
「我在等一個鎖,不知道哪一個孫子一直不釋放!」
「我也在等鎖啊,我要是知道哪一個孫子不釋放鎖我非揍死他不可!」0x7954絕不示弱。
我偷偷地看了一眼,這傢伙懷裏不就抱着我正等的某導演的鎖嗎?
很明顯,0x7954也發現了我正抱着他正在等待的鎖。
很快咱們兩個就吵了起來,各執己見:
「把你的鎖先給我,讓我先作完!」
「不行,歷來都是作完工做才釋放鎖,如今絕對不能給你!」
從爭吵到打起來,就那麼幾秒鐘的事兒。更重要的是,咱們倆不只僅持有這個著名導演和演員的鎖,還有不少其餘的鎖,致使等待的線程愈來愈多,圍觀的人們把屋子都擠滿了。最後事情真的鬧大了,我歷來沒見過的終極大boss「操做系統」也來了。大Boss畢竟見多識廣,他看了一眼,哼了一聲,很不屑地說:
「又出現死鎖了。」
「大家倆要Kill掉一個,來吧,過來抽籤。」
這一會兒把我給嚇尿了,這麼嚴重啊!我戰戰兢兢地抽了籤,打開一看,是個「活」字。唉,小命終於保住了。
可憐的0x7954被迫交出了全部的資源之後,很不幸地被kill掉,消失了。我拿到了導演的鎖,能夠開始幹活了。大Boss「操做系統」如一陣風似的消失了,身後只傳來他的聲音:
「記住,咱們這裏導演>演員,不管任何狀況都要先得到導演的鎖。」
因爲這裏不只僅只有導演和演員,還有不少其餘人,大Boss留下了一個表格, 裏邊是個算法,用來計算資源的大小,計算出來之後,永遠按照從大到小的方式來得到鎖:
我回到線程池,你們都知道了個人歷險,圍着我問個不停。
凶神惡煞的線程調度員把大Boss的算法貼到了牆上。
天天早上,咱們都得像無節操的房屋中介、美容美髮店的服務員同樣,站在門口,像被耍猴同樣大聲背誦:
「多個資源加鎖要牢記,必定要按Boss的算法比大小,而後從最大的開始加鎖。」
第四回 江湖再見
又過了數日,我和其餘線程們發現了一個奇怪的事情:包裹的處理愈來愈簡單,無論任何包裹,無論是登陸、瀏覽、存錢……處理的步驟都是同樣的, 返回一個固定的html頁面。
有一次我偷偷地看了一眼,上面寫着:「本系統將於今晚 00:00 至4:00 進行維護升級, 給您帶來的不便咱們深感抱歉!」
我去告訴了老線程0x6904,他嘆了一口氣說:
「唉,咱們的生命也到頭了,看來立刻就要重啓系統,咱們就要消失了,再見吧兄弟。」
系統重啓的那一刻終於到來了。我看到屋子裏的東西一個個的不見了,等待車間、就緒車間,甚至CPU車間都慢慢地消失了。我身邊的線程兄弟也愈來愈少,最後只剩我本身了。
我在空曠的原野上大喊:「還有人嗎?」
無人應答。
咱們這一代線程池完成了使命……
不過下一代線程池即將重生!
(全文完)