我是一個線程(轉)
我是一個線程,我一出生就被編了個號: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還給了我兩個表格:
(1)沒有加鎖的情況