為什么下載小電影時,經(jīng)常會卡在99%?
點擊關注公眾號,Java干貨及時送達??

下載最怕什么,那絕對是進度條:99%。
這是一個充滿魔力的數(shù)字,曾讓我狂躁、焦慮,甚至激動得想砸鍵盤錘電腦扔手機。

比如下載學習資料或看動作大片,苦苦等待2小時,好不容易下到99%,以為2秒后就能享受大片的美妙,步入極樂世界。
結果半小時過去了,進度條死死卡在99%,任你千兆光纖,專線寬帶,愣是一絲不動,穩(wěn)如泰山。

再去檢查路由器,狂按重啟鍵,發(fā)現(xiàn)網(wǎng)絡一切正常,網(wǎng)頁秒開,唯獨進度條上的99%永恒不變。
即使你重啟電腦,重新打開下載軟件,重新開始那99%的下載任務,它依舊還是99%,不增不減。
你不禁開始疑惑:為什么進度條總要卡在99%?為什么最后1%永遠加載不動?
今天,要為大家破解這一千古謎題,揭開背后不可告人的真相。
技術原理導致
關于進度條99%的問題,得從它的誕生說起。
1896年,波蘭經(jīng)濟學家Karol Adamiecki制作了一種名叫時間表的圖,提出了早期的進度條概念,但是當時沒有具體的應用。
等到1979年,這哥們Mitchell Model在他的博士論文中提出了進度條。
論文里他表示:進度條能在復雜的計算機環(huán)境中監(jiān)視系統(tǒng)行為。
說白了就是:進度條能直觀展現(xiàn)電腦在做什么,做到哪種程度。

正因為進度條能用最簡單的圖案和數(shù)字,表達電腦復雜的計算過程的特性,于是漸漸在各大操作系統(tǒng)流行起來,成為了電腦的經(jīng)典標志之一。
但問題來了,人不是電腦更不是神,再牛X的程序員也無法預測電腦什么時候完成工作。
所以程序員開發(fā)出來的進度條,根本不能精準地反映出電腦情況,所謂的50%、80%、90%,僅是大概的數(shù)字,預測而已。
可以說你看到的進度條,和實際的進度是兩個東西。

對于一些可定量的項目,進度條基本可以和實際相符,但不同的硬件資源和后臺程序都會相互占據(jù)資源,計算機很難恒定分配運行,當你影片下載到99%時又打開了大型游戲,或者哪個小任務卡住了,就到了艱難的「1%時刻」。
其實這種1%隨時都在發(fā)生,但我們只對最后的1%印象深刻。

它有時候前面很快,后面很慢。
就像U盤復制文件,系統(tǒng)會根據(jù)文件數(shù)量和傳輸速度算好大概時間,但并不是每個百分比都執(zhí)行相同的工作,因為每個文件大小都不一樣,而最后1%可能因為還要驗證文件、全盤掃描、整理數(shù)據(jù)等等,所以耗時也最久。

它也可能一直不快不慢,因為它整條都是假的。
雖然卡在99%的等待并不讓人愉快,但也不得不承認,沒有0%到99%,我們的情緒會更焦躁,因為不知道盡頭在哪里。
這就是進度條的厲害之處——讓你心甘情愿地等待。

產(chǎn)品經(jīng)理的惡意
1985年,卡內基梅隆大學人機交互研究所教授Brad Myers還是一位研究生,當時他就在論文里提出了這個觀點:
只要看到進度條,人們就會感覺好點,它能讓人放松,讓人在等待時間去干點別的——去花5分鐘發(fā)個傳真,或者干些在1985年的辦公室會干的事。
雖然進度條由程序員開發(fā),但真正設計進度條的人,是產(chǎn)品經(jīng)理,包括功能、樣式、圖案等。
很多產(chǎn)品經(jīng)理在設計進度條時,會特意要求程序員制作一個**“虛假進度條”。**
可能你會問,產(chǎn)品經(jīng)理為什么無緣無故搞個假東西騙人呢?
給你們舉個栗子,看完就懂了。
假設現(xiàn)在有2個相同下載速度的進度條,A和B,它們的下載完成時間都是100秒。

A是經(jīng)過產(chǎn)品經(jīng)理特殊調教的虛假進度條,它很套路,用了20秒下載到99%,最后1%花了80秒完成。
B是老實進度條,沒被調教,10秒加載到10%,100秒100%,一分不差。
此時因為A前十秒加載到99%,而同樣時間B卻僅有10%,在強烈的對比下,大部分人會認為A比B更快,A比B更好用。
在優(yōu)勝劣汰的規(guī)則下,用戶肯定更多會選擇A這種方式的軟件,而產(chǎn)品經(jīng)理想要留住用戶,采用這種虛假進度條那是必須的。

現(xiàn)在明白了吧,有時候不是進度條不準,而是產(chǎn)品經(jīng)理在搞事。
下載完成后的塊校驗
根據(jù)我多年的經(jīng)驗,導致這種情況發(fā)生的原因主要還是因為資源****塊校驗的機制。

迅雷下載采用P2P協(xié)議加速,P2P的優(yōu)點在于有多個數(shù)據(jù)來源。
每個下載過該文件的人,相當于一臺服務器,當別人下載時自動在后臺上傳數(shù)據(jù),提供速度。
說白了就是下的人越多,你所下載的資源能被拼湊時間越短。
但缺點同樣也有,因為數(shù)據(jù)來源多,質量參差不齊外加上傳不穩(wěn)定,容易導致文件亂碼出錯。
因此迅雷定下了一個規(guī)則:在下載到99.9%的時候,會對文件進行塊檢驗,如果某個塊出現(xiàn)問題,無法重新下載,則會一直卡在當前進度不動。
下面這個圖很好的說明了問題:

兄弟你的形狀怎么跟我們不一樣啊?
如果哪天卡在99.9%不動,別傻楞去充白金會員,大聲告訴你:鈦金會員都沒用!

2.?阿里面試這樣問:Nacos配置中心交互模型是 push 還是 pull ?(原理+源碼分析)
最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結構等等。
獲取方式:點“在看”,關注公眾號并回復?Java?領取,更多內容陸續(xù)奉上。
文章有幫助的話,在看,轉發(fā)吧。
謝謝支持喲 (*^__^*)

