Java線程休眠之sleep方法詳解
讓線程睡眠的sleep方法
Thread 類中有一個(gè)靜態(tài)方法的sleep方法,當(dāng)該線程調(diào)用sleep方法后,就會(huì)暫時(shí)讓CPU的調(diào)度權(quán)。
但是監(jiān)視器資源比如鎖并不會(huì)釋放出去。在指定睡眠時(shí)間后,函數(shù)會(huì)正常返回。
如果線程在睡眠過程中如果如果調(diào)用了該線程的interrupt方法終端該線程,則會(huì)拋出sleep內(nèi)的InterruptedException異常而返回。
下面舉個(gè)例子,該線程在睡眠的擁有的監(jiān)視器并不會(huì)被釋放。
package com.example.demo.runnable.ChapterOne;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author 49800
*/
public class SleepTest {
private static final ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Thread threadA = new Thread(() -> {
lock.lock();
try {
System.out.println("ThreadA 在執(zhí)行了");
Thread.sleep(10000);
System.out.println("ThreadA 執(zhí)行完成了");
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
});
Thread threadB = new Thread(() -> {
lock.lock();
try {
System.out.println("ThreadB 在執(zhí)行了");
Thread.sleep(10000);
System.out.println("ThreadB 執(zhí)行完成了");
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
});
threadA.start();
threadB.start();
System.out.println("Main 方法已經(jīng)在執(zhí)行了");
try {
threadA.join();
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main 方法已經(jīng)在執(zhí)行完成了");
}
}
上面用到了獨(dú)占鎖,獨(dú)占鎖就是當(dāng)一個(gè)線程在使用該鎖的時(shí)候,另一個(gè)線程必須等另一個(gè)線程釋放鎖后,下一個(gè)線程才能執(zhí)行。
這樣上面兩個(gè)線程就不會(huì)交叉執(zhí)行。從上面的執(zhí)行結(jié)果來看,當(dāng)某一線程在在開始執(zhí)行后。
執(zhí)行到sleep方法,就暫停十秒才會(huì)打印執(zhí)行完成。因?yàn)檎{(diào)用了join的方法,所以必須這兩個(gè)線程執(zhí)行完成后才能執(zhí)行main方法。
在線程睡眠時(shí),其他線程調(diào)用該線程的sleep方法,則會(huì)拋出異常。
package com.example.demo.runnable.ChapterOne;
/**
* @author 49800
*/
public class SleepExceptionTest {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
System.out.println("開始執(zhí)行");
Thread.sleep(10000);
System.out.println("執(zhí)行完畢");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
try {
// Main 方法睡眠3s
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}結(jié)果:

子線程在睡眠期間,主線程中斷了他,所以在主線程在調(diào)用sleep方法后拋出了異常。
另外需要注意的事sleep(long millis)是毫秒值,當(dāng)傳入的是一個(gè)負(fù)數(shù)的時(shí)候也是會(huì)拋出異常的。
到此這篇關(guān)于Java線程休眠之sleep方法詳解的文章就介紹到這了,更多相關(guān)Java線程休眠內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼
本文主要介紹了SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼,使用Guava中的Strings、Maps和CharMatcher類來進(jìn)行日志脫敏,保護(hù)敏感數(shù)據(jù)的安全,感興趣的可以了解一下2024-01-01
Springboot實(shí)現(xiàn)將默認(rèn)tomcat容器改為Undertow
Undertow是一個(gè)高性能的Java Web服務(wù)器,支持Servlet和WebSocket,適用于高并發(fā)場(chǎng)景,Spring Boot可以使用Undertow作為嵌入式服務(wù)器,通過JMeter進(jìn)行壓力測(cè)試,展示了Undertow在高并發(fā)下的良好性能2025-11-11
Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解
這篇文章主要介紹了Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解,負(fù)載均衡,其含義就是指將負(fù)載進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù),需要的朋友可以參考下2023-08-08
spring boot task實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建定時(shí)任務(wù)的方法
這篇文章主要介紹了spring boot task實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建定時(shí)任務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之嘟嘟健身房管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)健身房管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11
從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制
這篇文章主要介紹了從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制,帶有GC是Java語言的重要特性之一,需要的朋友可以參考下2015-11-11
解讀java?try?catch?異常后還會(huì)繼續(xù)執(zhí)行嗎
這篇文章主要介紹了解讀java?try?catch?異常后還會(huì)不會(huì)繼續(xù)執(zhí)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
java實(shí)現(xiàn)響應(yīng)重定向發(fā)送post請(qǐng)求操作示例
這篇文章主要介紹了java實(shí)現(xiàn)響應(yīng)重定向發(fā)送post請(qǐng)求操作,結(jié)合實(shí)例形式分析了java請(qǐng)求響應(yīng)、重定向及數(shù)據(jù)處理相關(guān)操作技巧,需要的朋友可以參考下2020-04-04

