干(gan)貨分享(xiang) javasleep
時間:2018-12-25 來源:華清遠見
在提及線程睡眠(sleep)之前,先(xian)要清楚Java中(zhong)關(guan)于線程的概念(nian)。
線(xian)程(cheng)(cheng)(cheng)(cheng)(英語:thread)是(shi)(shi)操作(zuo)系(xi)統能(neng)夠進(jin)行(xing)運算調度(du)的(de)最(zui)小單位(wei)。它被包含在進(jin)程(cheng)(cheng)(cheng)(cheng)之(zhi)中(zhong),是(shi)(shi)進(jin)程(cheng)(cheng)(cheng)(cheng)中(zhong)的(de)實際運作(zuo)單位(wei)。一條線(xian)程(cheng)(cheng)(cheng)(cheng)指的(de)是(shi)(shi)進(jin)程(cheng)(cheng)(cheng)(cheng)中(zhong)一個單一順序(xu)的(de)控制流(liu),一個進(jin)程(cheng)(cheng)(cheng)(cheng)中(zhong)可以并(bing)發多(duo)個線(xian)程(cheng)(cheng)(cheng)(cheng),每條線(xian)程(cheng)(cheng)(cheng)(cheng)并(bing)行(xing)執行(xing)不同(tong)的(de)任務。在Unix System V及SunOS中(zhong)也被稱為輕(qing)(qing)量(liang)進(jin)程(cheng)(cheng)(cheng)(cheng)(lightweight processes),但輕(qing)(qing)量(liang)進(jin)程(cheng)(cheng)(cheng)(cheng)更多(duo)指內核線(xian)程(cheng)(cheng)(cheng)(cheng)(kernel thread),而把用(yong)戶(hu)線(xian)程(cheng)(cheng)(cheng)(cheng)(user thread)稱為線(xian)程(cheng)(cheng)(cheng)(cheng)。
線程(cheng)是(shi)獨立(li)調(diao)度(du)和分派(pai)的(de)基本單位。線程(cheng)可以為(wei)操作系統內核(he)調(diao)度(du)的(de)內核(he)線程(cheng),如Win32線程(cheng);由用戶(hu)進程(cheng)自行調(diao)度(du)的(de)用戶(hu)線程(cheng),如Linux平臺的(de)POSIX Thread;或者由內核(he)與用戶(hu)進程(cheng),如Windows 7的(de)線程(cheng),進行混合調(diao)度(du)。
同一進(jin)(jin)程(cheng)中(zhong)的多(duo)條線(xian)程(cheng)將共享該進(jin)(jin)程(cheng)中(zhong)的全部系統資源,如虛擬地址空間,文件描述(shu)符和(he)信號處理等(deng)等(deng)。但同一進(jin)(jin)程(cheng)中(zhong)的多(duo)個線(xian)程(cheng)有各(ge)自的調用棧(zhan)(call stack),自己(ji)的寄存器環境(register context),自己(ji)的線(xian)程(cheng)本地存儲(thread-local storage)。
一個進程(cheng)可以有(you)很多線(xian)程(cheng),每條線(xian)程(cheng)并行執行不同的任務。
在多核(he)或多CPU,或支(zhi)持Hyper-threading的CPU上使用(yong)(yong)多線(xian)程(cheng)(cheng)程(cheng)(cheng)序設(she)計(ji)(ji)的好處是顯而易見,即(ji)提高了程(cheng)(cheng)序的執(zhi)(zhi)行(xing)吞(tun)吐(tu)率。在單CPU單核(he)的計(ji)(ji)算(suan)機上,使用(yong)(yong)多線(xian)程(cheng)(cheng)技術,也可以(yi)把進程(cheng)(cheng)中(zhong)負責I/O處理、人機交互而常被(bei)阻塞的部(bu)分(fen)(fen)與密集計(ji)(ji)算(suan)的部(bu)分(fen)(fen)分(fen)(fen)開來(lai)執(zhi)(zhi)行(xing),編(bian)寫專(zhuan)門(men)的workhorse線(xian)程(cheng)(cheng)執(zhi)(zhi)行(xing)密集計(ji)(ji)算(suan),從而提高了程(cheng)(cheng)序的執(zhi)(zhi)行(xing)效率。
簡(jian)單說,線程(cheng)可以理解為程(cheng)序(xu)中每一條單獨(du)運行的程(cheng)序(xu)鏈路。
Java程序(xu)默認是(shi)有一個線程的(de),也稱之(zhi)為主線程。比如main方(fang)法(fa)所在的(de)線程就是(shi)主線程,我(wo)們(men)寫的(de)代碼(ma)會依(yi)次的(de)執行,如下(xia),每次循環都會打印時間戳:

運(yun)行結果如下:

,可以發(fa)現(xian),程(cheng)序(xu)(xu)在不到1ms的(de)時間內順序(xu)(xu)執行了(le)每(mei)一次(ci)循環。
那么線程(cheng)(cheng)在執行的過程(cheng)(cheng)中(zhong)能(neng)不能(neng),停止(zhi)下來呢?
最簡單的方式就是使用線(xian)程的休(xiu)眠,也(ye)就是sleep方法。
睡眠的(de)意思為,當前線程(cheng)占用cpu不(bu)放,但是什么事情也不(bu)做。
現(xian)在我(wo)們(men)更改上面(mian)的程(cheng)序(xu),讓循環每(mei)次執行的時候都睡(shui)眠一秒(miao)鐘。調用方式(shi)如下:

這個(ge)(ge)方法(fa)是Thread類的(de)(de)一(yi)個(ge)(ge)靜態方法(fa),會(hui)檢測(ce)所(suo)在的(de)(de)當前的(de)(de)線程,并睡眠一(yi)段時間(jian),參數(shu)為睡眠的(de)(de)時常(chang)(單位:毫(hao)秒)。
但是(shi)發現有異常(chang)的拋出,使(shi)用異常(chang)處(chu)理,如(ru)下:

異常類型為InterruptedException,什么時候會拋出呢?
當前(qian)線程的對象(xiang)如(ru)果(guo)在睡眠過程中,調(diao)用了(le)interrupt方(fang)法,可以停止(zhi)睡眠,并拋出InterruptedException異常。
現(xian)在(zai)我們,運行上面的程序,觀察(cha)結果:

是不是每(mei)隔(ge)一秒鐘就輸出了一次呢?至此(ci)關于(yu)Java的sleep方法就講完了。

