版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職市政工程技術(shù)(橋梁養(yǎng)護(hù)技術(shù))試題及答案
- 2025年高職新能源裝備技術(shù)(風(fēng)電設(shè)備維護(hù))試題及答案
- 2025年大學(xué)大一(計(jì)算機(jī)應(yīng)用技術(shù))數(shù)據(jù)庫開發(fā)實(shí)務(wù)階段測試題
- 財(cái)保職業(yè)發(fā)展路徑
- 神池介紹教學(xué)課件
- 2026新疆昌吉州檢察機(jī)關(guān)招聘聘用制書記員8人備考題庫及完整答案詳解一套
- 河北省滄州市吳橋中學(xué)2026屆高三一模語文試題(含答案)
- (九年級道德與法治)2025年秋綿陽市鹽亭縣九年級(上)期末教學(xué)質(zhì)量監(jiān)測試卷
- 2026國家知識產(chǎn)權(quán)局專利局專利審查協(xié)作北京中心福建分中心專利審查員招聘100人備考題庫帶答案詳解
- 2026云南迪慶州德欽縣公安局招聘警務(wù)輔助人員2人備考題庫含答案詳解
- GB/T 17213.4-2015工業(yè)過程控制閥第4部分:檢驗(yàn)和例行試驗(yàn)
- FZ/T 73009-2021山羊絨針織品
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- GB∕T 5900.2-2022 機(jī)床 主軸端部與卡盤連接尺寸 第2部分:凸輪鎖緊型
- 2011-2015廣汽豐田凱美瑞維修手冊wdl
- DFMEA編制作業(yè)指導(dǎo)書新版
- KTronics籃輸送式洗碗碟機(jī)操作手冊
- DB35∕T 1844-2019 高速公路邊坡工程監(jiān)測技術(shù)規(guī)程
- 城市管理綜合執(zhí)法局城管執(zhí)法與執(zhí)法程序PPT模板
- 閥門基礎(chǔ)知識上
- 第二章注射成型工藝與模具結(jié)構(gòu)
評論
0/150
提交評論