我是一個(gè)線程忿磅, 我一出生就被編了個(gè)號(hào): 0x3704, 然后被領(lǐng)到一個(gè)昏暗的屋子里罐农, 這里我發(fā)現(xiàn)了很多和我一模一樣的同伴汗侵。
我身邊的同伴0x6900 待的時(shí)間比較長崔拥, 他帶著滄桑的口氣對我說:
我們線程的宿命就是處理包裹极舔。 把包裹處理完以后還得馬上回到這里,否則可能永遠(yuǎn)回不來了链瓦。
我一臉懵懂拆魏,包裹,什么包裹?
”不要著急渤刃,馬上你就會(huì)明白了拥峦, 我們這里是不養(yǎng)閑人的∠疲“
果然事镣,沒多久,屋子的門開了揪胃, 一個(gè)面貌兇惡的家伙吼道:
"0x3704 ,出來Aв础"
我一出來就被塞了一個(gè)沉甸甸的包裹,上面還有附帶著一個(gè)寫滿了操作步驟的紙喊递。
"快去随闪,把這個(gè)包裹處理了。"
"去哪兒處理"
"跟著指示走骚勘, 先到就緒車間"
果然铐伴,地上有指示箭頭,跟著它來到了一間明亮的大屋子俏讹,這里已經(jīng)有不少線程了当宴, 大家都很緊張,好像時(shí)刻準(zhǔn)備著往前沖泽疆。
我剛一進(jìn)來户矢,就聽見廣播說:“0x3704, 進(jìn)入車間”
我趕緊往前走, 身后很多人議論說:
”他太幸運(yùn)了殉疼, 剛進(jìn)入就緒狀態(tài)就能運(yùn)行“
”是不是有關(guān)系梯浪?“
”不是,你看人家的優(yōu)先級(jí)多高啊瓢娜, 唉“
前邊就是車間挂洛, 這里簡直是太美了, 怪不得老線程總是嘮叨著說:要是能一直待在這里就好了眠砾。
這里空間大虏劲,視野好,空氣清新褒颈,鳥語花香伙单,還有很多從來沒見過的人,像服務(wù)員一樣等著為我服務(wù)哈肖。
他們也都有編號(hào), 更重要的是每個(gè)人還有個(gè)標(biāo)簽念秧,上面寫著:硬盤淤井,數(shù)據(jù)庫,內(nèi)存,網(wǎng)卡...
我現(xiàn)在理解不了币狠,看看操作步驟吧:
**第一步:從包裹中取出參數(shù) **
打開包裹游两, 里邊有個(gè)HttpRequest 對象, 可以取到 userName, password兩個(gè)參數(shù)
第二步:執(zhí)行登錄操作
奧,原來是有人要登錄啊漩绵,我把userName/password 交給 數(shù)據(jù)庫服務(wù)員贱案,他拿著數(shù)據(jù), 慢騰騰的走了止吐。
他怎么這么慢宝踪? 不過我是不是正好可以在車間里多待一會(huì)兒? 反正也沒法執(zhí)行第三步。
就在這時(shí)碍扔,車間里的廣播響了:
"0x3704, 我是CPU , 記住你正在執(zhí)行的步驟瘩燥, 馬上帶包裹離開"
我慢騰騰的開始收拾
”快點(diǎn), 別的線程馬上就要進(jìn)來了“
離開這個(gè)車間不同, 又來到一個(gè)大屋子厉膀,這里很多線程慢騰騰的在喝茶,打牌二拐。
”哥們服鹅,你們沒事干了?“
”你新來的把百新, 你不知道我在等數(shù)據(jù)庫服務(wù)員給我數(shù)據(jù)捌笕怼! 吟孙,據(jù)說他們比我們慢好幾十萬倍澜倦, 在這里好好歇吧“
”啊杰妓? 這么慢藻治? 我這里有人在登錄系統(tǒng), 能等這么長時(shí)間嗎"
”放心巷挥,你沒聽說過人間一天桩卵, CPU一年嗎, 我們這里是用納秒倍宾,毫秒計(jì)時(shí)的雏节, 人間等待一秒,相當(dāng)于我們好幾天呢高职, 來的及“
干脆睡一會(huì)吧 钩乍, 不知道過了多久 ,大喇叭又開始廣播了:
"0x3704怔锌, 你的數(shù)據(jù)來了寥粹,快去執(zhí)行”
我轉(zhuǎn)身就往CPU車間跑变过,發(fā)現(xiàn)這里的們只出不進(jìn)!
后面?zhèn)鱽黻囮嚭逍β暎?/strong>
”果然是新人涝涤, 不知道還得去就緒車間等“
于是趕緊到就緒車間媚狰, 這次沒有那么好運(yùn)了, 等了好久才被再次叫進(jìn)CPU車間阔拳。
在等待的時(shí)候崭孤, 我聽見有人小聲議論:
”聽說了嗎,最近有個(gè)線程被kill掉了“
”為啥昂Α辨宠?“
”這家伙賴在CPU車間不走, 把CPU利用率一直搞成100%罪针,后來就被kill掉了“
”Kill掉以后弄哪兒去了“
”可能被垃圾回收了吧“
我心里打了個(gè)寒噤 彭羹, 趕緊接著處理, 收下的動(dòng)作塊多了泪酱,第二步登錄成功了
第三步:構(gòu)建登錄成功后的主頁
這一步有點(diǎn)費(fèi)時(shí)間派殷, 因?yàn)橛泻芏郒TML需要處理, 不知道代碼誰寫的墓阀,處理起來很煩人毡惜。
我正在緊張的制作html呢, CPU有開始叫了:
"0x3704, 我是CPU , 記住你正在執(zhí)行的步驟斯撮, 馬上帶包裹離開"
”為啥啊“
”每個(gè)線程只能在CPU上運(yùn)行一段時(shí)間经伙,到了時(shí)間就得讓別人用了, 你去就緒車間待著勿锅, 等著叫你吧“
就這樣帕膜, 我一直在就緒-運(yùn)行 這兩個(gè)狀態(tài),不知道輪轉(zhuǎn)了多少次溢十, 終于安裝步驟清單把工作做完了垮刹。
最后順利的把包含html的包裹發(fā)了回去。
至于登錄以后干什么事兒 张弛, 我就不管了荒典。
馬上就要回到我那昏暗的房間了, 真有點(diǎn)舍不得這里吞鸭。
不過相對于有些線程寺董, 我還是幸運(yùn)的, 他們運(yùn)行完以后就徹底的銷毀了刻剥,而我還活著 遮咖!
回到了小黑屋, 老線程0x6900 問:
”怎么樣造虏?第一天有什么感覺御吞?“
”我們的世界規(guī)則很復(fù)雜 踢械, 首先你不知道什么時(shí)候會(huì)被挑中執(zhí)行; 第二 ,在執(zhí)行的過程中隨時(shí)可能被打斷魄藕,讓出CPU車間;
第三,一旦出現(xiàn)硬盤撵术,數(shù)據(jù)庫這樣耗時(shí)的操作也得讓出CPU,去等待; 第四背率,就是數(shù)據(jù)來了,你也不一定馬上執(zhí)行嫩与,還得等著CPU挑選“
”小伙子理解的不錯(cuò)啊“
”我不明白為什么很多線程都執(zhí)行完就死了寝姿, 為什么咱們還活著?“
”你還不知道划滋, 長生不老是我們的特權(quán)饵筑, 我們這里有個(gè)正式的名稱,叫做 線程池处坪!“
平淡的日子就這么一天天過去根资, 作為一個(gè)線程, 我每天的生活都是取包裹同窘,處理包裹玄帕,然后回到我們昏暗的家:線程池。
有一天我回來的時(shí)候想邦, 聽到有個(gè)兄弟說裤纹, 今天要好好休息下,明天就是最瘋狂的一天丧没。
我看了一眼日歷鹰椒,明天是 11月11號(hào) 。
果然呕童,零點(diǎn)剛過漆际,不知道那些人類怎么了, 瘋狂的投遞包裹拉庵, 為了應(yīng)付蜂擁而至的海量包裹灿椅, 線程池里沒有一個(gè)人能閑下來,全部出去處理包裹钞支,CPU車間利用率超高茫蛹,硬盤在嗡嗡轉(zhuǎn), 網(wǎng)卡瘋狂的閃烁挟, 即便如此婴洼, 還是處理不完,堆積如山撼嗓。
我們也沒有辦法柬采,實(shí)在是太多太多了欢唾, 這些包裹中大部分都是瀏覽頁面,下訂單粉捻,買礁遣,買,買肩刃。
不知道過了多久祟霍, 包裹山終于慢慢的消失了。
終于能夠喘口氣盈包, 我想我永遠(yuǎn)都不會(huì)忘記這一天沸呐。
通過這個(gè)事件,我明白了我所處的世界:這是一個(gè)電子商務(wù)的網(wǎng)站呢燥!
我每天的工作就是處理用戶的登錄崭添,瀏覽, 購物車叛氨,下單呼渣,付款。
我問線程池的元老0x6900 : " 我們要工作到什么時(shí)候力试?"
" 要一直等到系統(tǒng)重啟的那一刻"徙邻, 0x6900 說
" 那你經(jīng)歷過系統(tǒng)重啟嗎?"
" 怎么可能畸裳? , 系統(tǒng)重啟就是我們的死亡時(shí)刻缰犁, 也就是世界末日,一旦重啟怖糊, 整個(gè)線程池全部銷毀帅容,時(shí)間和空間全部消失,一切從頭再來”
" 那什么時(shí)候會(huì)重啟伍伤?"
" 這就不好說了,好好享受眼前的生活吧....."
其實(shí)生活豐富多彩并徘, 我最喜歡的包裹是上傳圖片,由于網(wǎng)絡(luò)慢扰魂,所以能在就緒車間麦乞, CPU車間待很長很長時(shí)間,可以認(rèn)識(shí)很多好玩的線程劝评。
比如說上次認(rèn)識(shí)了memecached 線程姐直,他給我說通過他緩存了很多的用戶數(shù)據(jù), 還是分布式的蒋畜! 很多機(jī)器上都有声畏!
我說怪不得后來的登錄操作快了那么多, 原來是不再從數(shù)據(jù)庫取數(shù)據(jù)了你那里就有啊姻成, 哎對了你是分布式的你去過別的機(jī)器沒有插龄?
他說怎么可能我每次也只能通過網(wǎng)絡(luò)往那個(gè)機(jī)器發(fā)送一個(gè)GET, PUT命令才存取數(shù)據(jù)而已愿棋, 別的一概不知。
再比如說上次在等待的時(shí)候遇到了數(shù)據(jù)庫連接的線程均牢, 我才知道它他那里也是一個(gè)連接池糠雨, 和我們線程池幾乎一模一樣。
他說有些包裹太變態(tài)了徘跪,竟然查看一年的訂單數(shù)據(jù)见秤, 簡直把我累死了。
我說拉倒吧你真椿, 你那是純數(shù)據(jù), 你把數(shù)據(jù)傳給我以后乎澄,我還得組裝成HTML, 工作量不知道比你大多少倍突硝。
他說一定你要和memecached搞好關(guān)系,直接從他那兒拿數(shù)據(jù)置济,盡量少直接調(diào)用數(shù)據(jù)庫解恰, 我們JDBC connection也能活的輕松點(diǎn)。
我說好啊好啊浙于, 關(guān)鍵是你得提前把數(shù)據(jù)搞到緩存啊护盈, 要不然我先問一遍緩存, 沒有數(shù)據(jù)羞酗, 我這不還得找你嗎腐宋?
生活就是這樣, 如果你自己不找點(diǎn)樂子檀轨,還有什么意思胸竞?
有一天我遇到一個(gè)可怕的事情, 差一點(diǎn)死在外邊参萄,回不了線程池了......
其實(shí)這次遇險(xiǎn)我應(yīng)該能夠預(yù)想到才對卫枝, 太大意了。
前幾天我處理過一些從http 發(fā)來的存款和取款的包裹讹挎, 老線程0x6900 特意囑咐我:
"處理這些包裹的時(shí)候要特別小心校赤, 你得一定要先獲得一把鎖, 在對賬戶存款或者取款的時(shí)候一定要把賬戶給鎖住筒溃, 要不然別的線程就會(huì)在你等待的時(shí)候趁虛而入马篮,搞破壞, 我年輕那會(huì)兒很毛糙铡羡,就捅了簍子"
為了“恐嚇”我积蔚, 好心的0x6900還給了我兩個(gè)表格:
1、沒有加鎖的情況
2烦周、加鎖的情況
我看的膽顫心驚尽爆, 原來不加鎖會(huì)帶來這么嚴(yán)重的事故怎顾。
從此以后看到存款,取款的包裹就倍加小心漱贱, 還好槐雾,沒有出過事故。
今天我收到的一個(gè)包裹是轉(zhuǎn)賬幅狮, 從某著名演員的賬號(hào)給某著名導(dǎo)演賺錢募强, 具體是誰我就不透漏了, 數(shù)額可真是不小
我按照老線程的吩咐崇摄, 肯定要加鎖啊擎值, 先對著名演員賬號(hào)加鎖, 在對著名導(dǎo)演賬號(hào)加鎖逐抑。
可我萬萬沒想到的是鸠儿, 還有一個(gè)線程,對厕氨,就是0x7954, 竟然同時(shí)在從這個(gè)導(dǎo)演到往這個(gè)演員轉(zhuǎn)賬进每。
于是乎,就出現(xiàn)了這么個(gè)情況:
剛開始我還不知道什么情況命斧, 一直坐在等待車間傻等田晚, 可是等的時(shí)間太長了, 長達(dá)幾十秒 国葬! 我可從來沒有經(jīng)歷過這樣的事件贤徒。
這時(shí)候我就看到了線程0x7954 , 他悠閑的坐在那里喝咖啡, 我和他聊了起來:
“哥們汇四, 我看你已經(jīng)喝了8杯咖啡了泞莉, 怎么還不去干活?”
“你不喝了9杯茶了嗎船殉?” 0x7954 回敬到鲫趁。
“我在等一個(gè)鎖, 不知道哪個(gè)孫子一直不釋放”
“我也在等鎖啊利虫,我要是知道哪個(gè)孫子不釋放鎖我非揍死他不可 ” 0x7954 毫不示弱挨厚。
我偷偷的看了一眼, 這家伙懷里不就抱著我正在等的 某導(dǎo)演的鎖嘛糠惫?
很明顯疫剃, 0x7954 也發(fā)現(xiàn)了我正抱著他正在等待的鎖。
很快我們兩個(gè)就吵了起來硼讽, 互不相讓:
"把你的鎖先給我巢价, 讓我先做完"
"不行, 從來都是做完工作才釋放鎖, 現(xiàn)在絕對不能給你"
從爭吵到打起來壤躲, 就那么幾秒鐘的事兒城菊。
更重要的是, 我們倆不僅僅持有這個(gè)著名導(dǎo)演和演員的鎖碉克, 還有很多其他的鎖凌唬, 導(dǎo)致等待的線程越來越多, 圍觀的人們把屋子都擠滿了漏麦。
最后事情真的鬧大了客税, 我從來沒見過終極大boss "操作系統(tǒng)" 也來了。
大Boss畢竟是見多識(shí)廣撕贞, 他看了一眼更耻, 哼了一聲 , 很不屑的說:
"又出現(xiàn)死鎖了"
"你們倆要Kill掉一個(gè)捏膨, 來吧酥夭, 過來抽簽 "
這一下子把我給嚇尿了, 這么嚴(yán)重凹狗堋!
我戰(zhàn)戰(zhàn)兢兢的抽了簽疙描,打開一看诚隙, 是個(gè)"活"字。
唉起胰,小命終于保住了久又。
可憐的0x7954 被迫交出了所有的資源以后, 很不幸的被kill掉效五, 消失了地消。
我拿到了導(dǎo)演的鎖, 可以開始干活了畏妖。
大Boss操作系統(tǒng)如一陣風(fēng)似的消失了脉执, 身后只傳來他的聲音:
記住, 我們這里導(dǎo)演>演員戒劫, 無論認(rèn)識(shí)情況都要先獲得導(dǎo)演的鎖
由于不僅僅是只有導(dǎo)演和演員半夷, 還有很多其他人, Boss留下了一個(gè)表格迅细, 里邊是個(gè)算法巫橄, 用來計(jì)算資源的大小, 計(jì)算出來以后,永遠(yuǎn)按照從大到小的方式來獲得鎖:
我回到線程池茵典, 大家都知道了我的歷險(xiǎn)湘换, 圍著我問個(gè)不停。
兇神惡煞的線程調(diào)度員把大Boss的算法貼到了墻上。
每天早上彩倚, 我們都得像無節(jié)操的房屋中介筹我, 美容美發(fā)店的服務(wù)員一樣, 站在門口署恍,像被耍猴一樣大聲背誦:
"多個(gè)資源加鎖要牢記崎溃, 一定要按Boss的算法比大小, 然后從最大的開始加鎖"
又過了很多天盯质, 我和其他線程們發(fā)現(xiàn)了一個(gè)奇怪的事情:包裹的處理越來越簡單
不管任何包裹袁串,不管是登錄, 瀏覽呼巷,存錢..... 處理的步驟都是一樣的, 返回一個(gè)固定的html頁面
有一次我偷偷的看了一眼囱修, 上面寫著:
"本系統(tǒng)將于今晚 00:00 至4:00 進(jìn)行維護(hù)升級(jí), 給你帶來的不便我們深感抱歉"
我去告訴了老線程0x6904, 他嘆了一口氣說:
"唉王悍, 我們的生命也到頭了破镰, 看來馬上就要重啟系統(tǒng), 我們就要消失了压储, 再見吧兄弟鲜漩。"
系統(tǒng)重啟的那一刻終于到來了。
我看到屋子里的東西一個(gè)個(gè)的不見了集惋, 等待車間孕似,就緒車間,甚至CPU車間都慢慢的消失了刮刑。
我身邊的線程兄弟也越來越少喉祭, 最后只剩我自己了。
我在空曠的原野上大喊: 還有人嗎雷绢?
無人應(yīng)答泛烙。
我們這一代線程池完成了使命。
下一代線程池將很快重生翘紊。
(完)