專業(yè)的武漢網(wǎng)站推廣阿里云建網(wǎng)站
介紹
sleep 方法會(huì)使當(dāng)前線程進(jìn)入指定毫秒數(shù)的休眠,暫停執(zhí)行,雖然給定了一個(gè)休眠的時(shí)間, 但是最終要以系統(tǒng)的定時(shí)器和調(diào)度器的精度為準(zhǔn),休眠有一個(gè)非常重要的特性,那就是其不 會(huì)放棄 monitor 鎖的所有權(quán)
使用 TimeUniT 替代 Thread.sleep
在 JDK1.5 以后,JDK 引入了一個(gè)枚舉 TimeUnit,其對 sleep 方法提供了很好的封裝, 使用它可以省去時(shí)間單位的換算步驟,比如線程想休眠 3 小時(shí) 24 分 17 秒 88 毫秒,使用TimeUnit 來實(shí)現(xiàn)就非常簡便優(yōu)雅了:??
Thread.sleep(12257088L);TimeUnit.HOURS.sleep(3);
TimeUnit.MINUTES.sleep(24);
TimeUnit.SECONDS.sleep(17);
TimeUnit.MILLISECONDS.sleep(88);
同樣的時(shí)間表達(dá),TimeUnit 顯然清晰很多,強(qiáng)烈建議在使用 Thread.sleep 的地方, 完全使用 TimeUnit 來代替,因?yàn)?sleep 能做的事情,TimeUnit 全部都能完成,并且可以 做的更好,后面內(nèi)容中,我將全部采用 TimeUnit 替代 sleep。
Thread.sleep(0)??
Thread.sleep(0) 表示掛起 0 毫秒,你可能覺得沒作用。其實(shí) Thread.sleep(0) 并 非是真的要線程掛起 0 毫秒,意義在于這次調(diào)用 Thread.sleep(0)的當(dāng)前線程確實(shí)的被凍 結(jié)了一下,讓其他線程有機(jī)會(huì)優(yōu)先執(zhí)行。Thread.sleep(0) 是你的線程暫時(shí)放棄 cpu,也 就是釋放一些未用的時(shí)間片給其他線程或進(jìn)程使用,就相當(dāng)于一個(gè)讓位動(dòng)作。 在線程中,調(diào)用 sleep(0)可以釋放 cpu 時(shí)間,讓線程馬上重新回到就緒隊(duì)列而非等 待隊(duì)列,sleep(0)釋放當(dāng)前線程所剩余的時(shí)間片(如果有剩余的話),這樣可以讓操作系 統(tǒng)切換其他線程來執(zhí)行,提升效率。
yield 和 sleep
在 JDK1.5 以前的版本中 yield 的方法事實(shí)上是調(diào)用了 sleep(0),但是他們之間存在著本質(zhì)的區(qū)別,具體如 下:
- sleep 會(huì)導(dǎo)致當(dāng)前線程暫停指定的時(shí)間,沒有 CPU 時(shí)間片的消耗;
- yield 只是對 CPU 調(diào)度器的一個(gè)提示,如果 CPU 調(diào)度器沒有忽略這個(gè)提示,它會(huì)導(dǎo)致 線程上下文的切換;
- sleep 會(huì)使線程短暫 block,會(huì)在給定的時(shí)間內(nèi)試放 CPU 資源;
- yield 會(huì)使 Running 狀態(tài)的 Thread 進(jìn)入 Runnable 狀態(tài)(如果 CPU 調(diào)度器沒有忽略 這個(gè)提示的話);
- sleep 幾乎百分之百的完成了給定時(shí)間的休眠,而 yield 的提示并不能一定保證。
wait 和 sleep 的區(qū)別
- sleep 是屬于 Thread 的方法,wait 屬于 Object;
- ?sleep 方法不需要被喚醒,wait 需要。
- sleep 方法不需要 synchronized,wait 需要;
- sleep 不會(huì)釋放鎖,wait 會(huì)釋放鎖并將線程加入 wait 隊(duì)列;
?