Java線程休眠的5種方法_第1頁
Java線程休眠的5種方法_第2頁
Java線程休眠的5種方法_第3頁
Java線程休眠的5種方法_第4頁
Java線程休眠的5種方法_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第Java線程休眠的5種方法目錄方法1:Thread.sleep方法2:TimeUnit方法3:wait方法4:Condition方法5:LockSupport總結(jié)前言:

在Java中,讓線程休眠的方法有很多,這些方法大致可以分為兩類,一類是設(shè)置時(shí)間,在一段時(shí)間后自動(dòng)喚醒,而另一個(gè)類是提供了一對休眠和喚醒的方法,在線程休眠之后,可以在任意時(shí)間對線程進(jìn)行喚醒。

PS:休眠是指讓某個(gè)線程暫停執(zhí)行(進(jìn)入等待狀態(tài)),喚醒指的是讓某個(gè)暫停的線程繼續(xù)執(zhí)行。

線程休眠的方法有以下5個(gè):

Thread.sleepTimeUnitwaitConditionLockSupport

其中sleep和TimeUnit是讓線程休眠一段時(shí)間后自動(dòng)喚醒,而wait、Condition、LockSupport提供了一對休眠和喚醒線程的方法,可以實(shí)現(xiàn)任意時(shí)刻喚醒某個(gè)線程。

方法1:Thread.sleep

Thread.sleep方法來自于Thread類,它是一個(gè)native本地方法,其實(shí)現(xiàn)源碼如下:

publicstaticnativevoidsleep(longmillis)throwsInterruptedException;

Thread.sleep方法需要傳遞一個(gè)long類型的毫秒數(shù),表示n毫秒之后自動(dòng)喚醒,它的基礎(chǔ)用法如下:

Threadt1=newThread(){

@Override

publicvoidrun(){

System.out.println("線程執(zhí)行:"+LocalDateTime.now());

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

System.out.println("線程結(jié)束:"+LocalDateTime.now());

t1.start();

以上程序的執(zhí)行結(jié)果如下圖所示:

方法2:TimeUnit

sleep方法因?yàn)橐獋鬟f一個(gè)毫秒類型的參數(shù),因此在設(shè)置大一點(diǎn)的時(shí)間時(shí)比較麻煩,比如設(shè)置1小時(shí)或1天時(shí),此時(shí)我們就可以使用TimeUnit來替代sleep方法實(shí)現(xiàn)休眠。TimeUnit的功能和sleep一樣,讓線程休眠N個(gè)單位時(shí)間之后自動(dòng)喚醒,它的基礎(chǔ)用法如下:

Threadt1=newThread(){

@Override

publicvoidrun(){

System.out.println("線程執(zhí)行:"+LocalDateTime.now());

try{

TimeUnit.SECONDS.sleep(1);//休眠1s

//TimeUnit.DAYS.sleep(1);//休眠1天

}catch(InterruptedExceptione){

e.printStackTrace();

System.out.println("線程結(jié)束:"+LocalDateTime.now());

t1.start();

以上程序的執(zhí)行結(jié)果如下圖所示:

當(dāng)我們查看TimeUnit源碼時(shí)就會發(fā)現(xiàn),它的底層是基于Thread.sleep方法實(shí)現(xiàn)的,其實(shí)現(xiàn)源碼如下:

方法3:wait

wait/notify/notifyAll都來自于Object類,其中:

wait()/wait(longtimeout):表示讓當(dāng)前線程進(jìn)入休眠狀態(tài)。notify():喚醒當(dāng)前對象上的一個(gè)休眠線程。notifyAll():喚醒當(dāng)前對象上的所有休眠線程。

其中wait()方法表示讓當(dāng)前線程無限期等待下去,直到遇到notify/notifyAll方法時(shí)才會被喚醒,而wait(longtimeout)表示接收一個(gè)long類型的超時(shí)時(shí)間,如果沒有遇到notify/notifyAll會在long毫秒之后自動(dòng)喚醒,如果遇到了notify/notifyAll方法會立即被喚醒。它的基礎(chǔ)用法如下:

Objectlock=newObject();

newThread(()-{

synchronized(lock){

try{

//讓當(dāng)前線程休眠

lock.wait();

}catch(InterruptedExceptione){

e.printStackTrace();

}).start();

synchronized(lock){

lock.notify();//喚醒當(dāng)前對象上一個(gè)休眠線程

//lock.notifyAll();//喚醒當(dāng)前對象上所有休眠的線程

}

需要注意的是wait/notify/notifyAll在使用時(shí)必須要配合synchronized一起使用,否則程序執(zhí)行會報(bào)錯(cuò)。

方法4:Condition

Condition作為wait的升級版,它提供的常用方法有以下幾個(gè):

await():讓當(dāng)前線程進(jìn)入等待狀態(tài),直到被通知(signal)或者被中斷時(shí)才會繼續(xù)執(zhí)行。awaitUninterruptibly():讓當(dāng)前線程進(jìn)入等待狀態(tài),直到被通知才會被喚醒,它對線程的中斷通知不做響應(yīng)。await(longtime,TimeUnitunit):在await()方法的基礎(chǔ)上添加了超時(shí)時(shí)間,如果過了超時(shí)時(shí)間還沒有遇到喚醒方法則會自動(dòng)喚醒并恢復(fù)執(zhí)行。awaitUntil(Datedeadline):讓當(dāng)前線程進(jìn)入等待狀態(tài),如果沒有遇到喚醒方法也會在設(shè)置的時(shí)間之后自動(dòng)喚醒。signal():喚醒一個(gè)等待在Condition上的線程。signalAll():喚醒等待在Condition上所有的線程。

它的基本用法如下:

importjava.time.LocalDateTime;

importjava.util.concurrent.locks.Condition;

importjava.util.concurrent.locks.Lock;

importjava.util.concurrent.locks.ReentrantLock;

publicclassConditionExample{

publicstaticvoidmain(String[]args)throwsInterruptedException{

//創(chuàng)建鎖

finalLocklock=newReentrantLock();

//創(chuàng)建Condition

finalConditioncondition=lock.newCondition();

newThread(()-{

System.out.println("線程執(zhí)行:"+LocalDateTime.now());

lock.lock();//得到鎖

try{

//休眠線程

condition.await();

}catch(InterruptedExceptione){

e.printStackTrace();

}finally{

lock.unlock();//釋放鎖

System.out.println("線程結(jié)束:"+LocalDateTime.now());

}).start();

Thread.sleep(1000);

lock.lock();//得到鎖

try{

//喚醒線程

condition.signal();

}finally{

lock.unlock();//釋放鎖

}

相比于wait方法,Condition對象更加靈活,因?yàn)樗梢栽谝话焰i上定義多個(gè)Condition對象進(jìn)行使用,

如下代碼所示:

//創(chuàng)建鎖

finalLocklock=newReentrantLock();

//創(chuàng)建Condition1

finalConditioncondition=lock.newCondition();

//創(chuàng)建Condition2

finalConditioncondition2=lock.newCondition();

//......

方法5:LockSupport

LockSupport是更加底層的操作線程休眠和喚醒的對象,它提供了兩個(gè)常用的方法:

LockSupport.park():休眠當(dāng)前線程。LockSupport.unpark(Threadthread):喚醒一個(gè)指定的線程。

它的基礎(chǔ)用法如下:

Threadt1=newThread(()-{

System.out.println("線程1休眠");

LockSupport.park();//休眠線程

System.out.println("線程1執(zhí)行結(jié)束");

},"線程1");

t1.start();

Threadt2=newThread(()-{

System.out.println("線程2休眠");

LockSupport.park();//休眠線程

System.out.println("線程2執(zhí)行結(jié)束");

},"線程2");

t2.start();

Threadt3=newThread(()-{

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

System.out.println("喚醒線程1");

LockSupport.unpark(t1);//喚醒線程1

},

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論