Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
在 Java 中,sleep() 和 wait() 方法都可以用來(lái)控制線程的執(zhí)行順序或等待特定條件的發(fā)生,但它們有著不同的使用場(chǎng)景和行為:
1. sleep()
- sleep() 方法來(lái)自于 Thread 類,用于讓當(dāng)前線程暫停執(zhí)行一段時(shí)間,以毫秒為單位。
- 調(diào)用 sleep() 方法會(huì)讓線程進(jìn)入阻塞狀態(tài),但不會(huì)釋放鎖。
- 通常用于模擬時(shí)間間隔、節(jié)流處理、或者簡(jiǎn)單的等待。
示例用法:
try {
Thread.sleep(1000); // 暫停當(dāng)前線程1秒鐘
} catch (InterruptedException e) {
e.printStackTrace();
}sleep() 方法是一個(gè)本地方法(native method),它會(huì)調(diào)用操作系統(tǒng)提供的功能來(lái)使當(dāng)前線程休眠指定的毫秒數(shù)。
當(dāng)調(diào)用 sleep() 方法時(shí),當(dāng)前線程會(huì)進(jìn)入 TIMED_WAITING 狀態(tài),直到指定的時(shí)間到達(dá)或者被中斷(InterruptedException)。
public static native void sleep(long millis) throws InterruptedException;
2. wait()
- wait() 方法來(lái)自于 Object 類,用于在多線程環(huán)境下實(shí)現(xiàn)線程間的協(xié)調(diào)與通信。
- 調(diào)用 wait() 方法會(huì)讓線程釋放對(duì)象鎖,并且進(jìn)入等待狀態(tài),直到其他線程調(diào)用相同對(duì)象上的 notify() 或 notifyAll() 方法來(lái)喚醒它,或者等待時(shí)間到達(dá)。
- 必須在同步塊或同步方法中調(diào)用 wait() 方法,否則會(huì)拋出 IllegalMonitorStateException 異常。
示例用法:
synchronized (sharedObject) {
while (!condition) {
try {
sharedObject.wait(); // 等待直到條件滿足
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}wait() 方法的不同重載允許在等待時(shí)設(shè)置超時(shí)時(shí)間。
當(dāng)調(diào)用 wait() 方法時(shí),當(dāng)前線程釋放對(duì)象的鎖,并進(jìn)入 WAITING 或者 TIMED_WAITING 狀態(tài),直到被其他線程調(diào)用相同對(duì)象的 notify() 或 notifyAll() 方法喚醒,或者等待超時(shí)。
public final void wait() throws InterruptedException {
wait(0);
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
區(qū)別總結(jié)
- 來(lái)源與使用對(duì)象:
- sleep() 是 Thread 類的靜態(tài)方法,用于讓當(dāng)前線程休眠一段時(shí)間。
- wait() 是 Object 類的方法,用于線程間的協(xié)調(diào)和通信。
- 鎖的釋放:
- sleep() 不會(huì)釋放鎖,線程仍然持有鎖。
- wait() 會(huì)釋放對(duì)象鎖,讓其他線程可以訪問(wèn)這個(gè)對(duì)象的同步方法或塊。
- 喚醒機(jī)制:
- sleep() 時(shí)間到達(dá)或者被中斷時(shí)會(huì)自動(dòng)喚醒。
- wait() 需要其他線程調(diào)用相同對(duì)象的 notify() 或 notifyAll() 方法來(lái)喚醒。
- 異常處理:
- sleep() 方法的中斷異常是 InterruptedException。
- wait() 方法的中斷異常也是 InterruptedException,但是在 wait() 中使用時(shí),建議使用循環(huán)檢查條件來(lái)避免虛假喚醒。
總結(jié)
sleep() 用于線程暫停執(zhí)行一段時(shí)間,適用于控制時(shí)間間隔;wait() 用于多線程間的協(xié)調(diào)和通信,適用于等待特定條件的發(fā)生。在使用時(shí)需要根據(jù)具體場(chǎng)景選擇合適的方法,并理解它們的不同行為和特點(diǎn)。
到此這篇關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的文章就介紹到這了,更多相關(guān)Java Sleep()方法與Wait()方法的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot引入druid解析sql的過(guò)程
在開(kāi)發(fā)中,有時(shí)我們可能會(huì)需要獲取SQL中的表名,那么因?yàn)椴煌臄?shù)據(jù)源類型SQL會(huì)存在部分差異,那么我們就可以使用alibaba 的druid包實(shí)現(xiàn)不同的數(shù)據(jù)源類型的sql解析,需要的朋友可以參考下2023-08-08
Spring解讀@Component和@Configuration的區(qū)別以及源碼分析
通過(guò)實(shí)例分析@Component和@Configuration注解的區(qū)別,核心在于@Configuration會(huì)通過(guò)CGLIB代理確保Bean的單例,而@Component不會(huì),在Spring容器中,使用@Configuration注解的類會(huì)被CGLIB增強(qiáng),保證了即使在同一個(gè)類中多次調(diào)用@Bean方法2024-10-10
Springboot+devtools配置熱部署過(guò)程
SpringBoot提供的spring-boot-devtools模塊可以實(shí)現(xiàn)應(yīng)用的熱部署,極大提升開(kāi)發(fā)效率,通過(guò)添加POM依賴、配置yml文件、使用IDE快捷鍵等步驟,可以無(wú)需手動(dòng)重啟即可自動(dòng)加載變更,這種方式不僅適用于靜態(tài)文件的自動(dòng)加載,也適用于整個(gè)SpringBoot工程,是提高開(kāi)發(fā)效率的有效手段2024-11-11
SpringBoot監(jiān)控API請(qǐng)求耗時(shí)的6中解決解決方案
本文介紹SpringBoot中記錄API請(qǐng)求耗時(shí)的6種方案,包括手動(dòng)埋點(diǎn)、AOP切面、攔截器、Filter、事件監(jiān)聽(tīng)、Micrometer+Prometheus,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07
實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法
今天小編就為大家分享一篇關(guān)于實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法
本篇文章主要介紹了在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法,本文就是在分析監(jiān)聽(tīng)器回調(diào)原理的基礎(chǔ)上,在spring環(huán)境中使用自定義的注解實(shí)現(xiàn)一個(gè)監(jiān)聽(tīng)器。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
內(nèi)存屏障由來(lái)及實(shí)現(xiàn)思路
這篇文章主要為大家詳細(xì)介紹了內(nèi)存屏障由來(lái)及實(shí)現(xiàn)思路的詳細(xì)講解,讓大家徹底的理解內(nèi)存屏障,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-01-01

