故事講解:我是一個線程

來自:碼農翻身(微信號:coderising)

  作者:IBM劉欣

  我是一個線程,我一出生就被編了個號: 0x3704,然後被領到一個昏暗的屋子裏, 這裏我發現了很多和我一模一樣的同伴。

  我身邊的同伴0x6900待的時間比較長, 他帶着滄桑的口氣對我說:

  “我們線程的宿命就是處理包裹。把包裹處理完以後還得馬上回到這裏,否則可能永遠回不來了。”

  我一臉懵懂,包裹,什麼包裹?

  “不要着急,馬上你就會明白了, 我們這裏是不養閒人的。”

  果然,沒多久,屋子的門開了, 一個面貌兇惡的傢伙吼道:

  “0x3704 ,出來!”

  我一出來就被塞了一個沉甸甸的包裹,上面還有附帶着一個寫滿了操作步驟的紙。

  “快去,把這個包裹處理了。”

  “去哪兒處理?”

  “跟着指示走, 先到就緒車間”

  果然,地上有指示箭頭,跟着它來到了一間明亮的大屋子,這裏已經有不少線程了, 大家都很緊張,好像時刻準備着往前衝。

  我剛一進來,就聽見廣播說:“0x3704,進入車間”

  我趕緊往前走, 身後很多人議論說:

  ”他太幸運了, 剛進入就緒狀態就能運行”

  “是不是有關係?”

  “不是,你看人家的優先級多高啊, 唉~”

  前邊就是車間, 這裏簡直是太美了, 怪不得老線程總是嘮叨着說:要是能一直待在這裏就好了。

  這裏空間大,視野好,空氣清新,鳥語花香,還有很多從來沒見過的人,像服務員一樣等着爲我服務。

  他們也都有編號, 更重要的是每個人還有個標籤,上面寫着:硬盤,數據庫,內存,網卡...

  我現在理解不了,看看操作步驟吧:

  第一步:從包裹中取出參數

  打開包裹, 裏邊有個HttpRequest對象,可以取到userName, password兩個參數。

  第二步:執行登錄操作

  奧,原來是有人要登錄啊,我把userName/password 交給數據庫服務員,他拿着數據, 慢騰騰的走了。

  他怎麼這麼慢?不過我是不是正好可以在車間裏多待一會兒? 反正也沒法執行第三步。

  就在這時,車間裏的廣播響了: 

  “0x3704,我是CPU,記住你正在執行的步驟,馬上帶包裹離開”

  我慢騰騰的開始收拾。。。

  “快點, 別的線程馬上就要進來了”

  離開這個車間, 又來到一個大屋子,這裏很多線程慢騰騰的在喝茶,打牌。

  “哥們,你們沒事幹了?”

  “你新來的吧,你不知道我在等數據庫服務員給我數據啊,據說他們比我們慢好幾十萬倍, 在這裏好好歇吧”

  “啊? 這麼慢? 我這裏有人在登錄系統, 能等這麼長時間嗎”

  “放心,你沒聽說過人間一天,CPU一年嗎, 我們這裏是用納秒,毫秒計時的,人間等待一秒,相當於我們好幾天呢,來的及”

  乾脆睡一會吧 , 不知道過了多久 ,大喇叭又開始廣播了:

  “0x3704, 你的數據來了,快去執行”

  我轉身就往CPU車間跑,發現這裏的們只出不進!

  後面傳來陣陣鬨笑聲:

  “果然是新人,不知道還得去就緒車間等”

  於是趕緊到就緒車間,這次沒有那麼好運了,等了好久才被再次叫進CPU車間。

  在等待的時候, 我聽見有人小聲議論:

  “聽說了嗎,最近有個線程被kill掉了”

  “爲啥啊?”

  “這傢伙賴在CPU車間不走,把CPU利用率一直搞成100%,後來就被kill掉了”

  “Kill掉以後弄哪兒去了”

  “可能被垃圾回收了吧”

  我心裏打了個寒噤 , 趕緊接着處理,收下的動作塊多了,第二步登錄成功了。

  第三步:構建登錄成功後的主頁

  這一步有點費時間, 因爲有很多HTML需要處理, 不知道代碼誰寫的,處理起來很煩人。

  我正在緊張的製作HTM呢, 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車間都慢慢的消失了。

  我身邊的線程兄弟也越來越少,最後只剩我自己了。

  我在空曠的原野上大喊:還有人嗎?

  無人應答。

  我們這一代線程池完成了使命。

  下一代線程池將很快重生。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章