Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
在 Java 中,sleep() 和 wait() 方法都可以用來控制線程的執(zhí)行順序或等待特定條件的發(fā)生,但它們有著不同的使用場景和行為:
1. sleep()
- sleep() 方法來自于 Thread 類,用于讓當前線程暫停執(zhí)行一段時間,以毫秒為單位。
- 調(diào)用 sleep() 方法會讓線程進入阻塞狀態(tài),但不會釋放鎖。
- 通常用于模擬時間間隔、節(jié)流處理、或者簡單的等待。
示例用法:
try {
Thread.sleep(1000); // 暫停當前線程1秒鐘
} catch (InterruptedException e) {
e.printStackTrace();
}sleep() 方法是一個本地方法(native method),它會調(diào)用操作系統(tǒng)提供的功能來使當前線程休眠指定的毫秒數(shù)。
當調(diào)用 sleep() 方法時,當前線程會進入 TIMED_WAITING 狀態(tài),直到指定的時間到達或者被中斷(InterruptedException)。
public static native void sleep(long millis) throws InterruptedException;
2. wait()
- wait() 方法來自于 Object 類,用于在多線程環(huán)境下實現(xiàn)線程間的協(xié)調(diào)與通信。
- 調(diào)用 wait() 方法會讓線程釋放對象鎖,并且進入等待狀態(tài),直到其他線程調(diào)用相同對象上的 notify() 或 notifyAll() 方法來喚醒它,或者等待時間到達。
- 必須在同步塊或同步方法中調(diào)用 wait() 方法,否則會拋出 IllegalMonitorStateException 異常。
示例用法:
synchronized (sharedObject) {
while (!condition) {
try {
sharedObject.wait(); // 等待直到條件滿足
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}wait() 方法的不同重載允許在等待時設置超時時間。
當調(diào)用 wait() 方法時,當前線程釋放對象的鎖,并進入 WAITING 或者 TIMED_WAITING 狀態(tài),直到被其他線程調(diào)用相同對象的 notify() 或 notifyAll() 方法喚醒,或者等待超時。
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é)
- 來源與使用對象:
- sleep() 是 Thread 類的靜態(tài)方法,用于讓當前線程休眠一段時間。
- wait() 是 Object 類的方法,用于線程間的協(xié)調(diào)和通信。
- 鎖的釋放:
- sleep() 不會釋放鎖,線程仍然持有鎖。
- wait() 會釋放對象鎖,讓其他線程可以訪問這個對象的同步方法或塊。
- 喚醒機制:
- sleep() 時間到達或者被中斷時會自動喚醒。
- wait() 需要其他線程調(diào)用相同對象的 notify() 或 notifyAll() 方法來喚醒。
- 異常處理:
- sleep() 方法的中斷異常是 InterruptedException。
- wait() 方法的中斷異常也是 InterruptedException,但是在 wait() 中使用時,建議使用循環(huán)檢查條件來避免虛假喚醒。
總結(jié)
sleep() 用于線程暫停執(zhí)行一段時間,適用于控制時間間隔;wait() 用于多線程間的協(xié)調(diào)和通信,適用于等待特定條件的發(fā)生。在使用時需要根據(jù)具體場景選擇合適的方法,并理解它們的不同行為和特點。
到此這篇關于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的文章就介紹到這了,更多相關Java Sleep()方法與Wait()方法的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring解讀@Component和@Configuration的區(qū)別以及源碼分析
通過實例分析@Component和@Configuration注解的區(qū)別,核心在于@Configuration會通過CGLIB代理確保Bean的單例,而@Component不會,在Spring容器中,使用@Configuration注解的類會被CGLIB增強,保證了即使在同一個類中多次調(diào)用@Bean方法2024-10-10
SpringBoot監(jiān)控API請求耗時的6中解決解決方案
本文介紹SpringBoot中記錄API請求耗時的6種方案,包括手動埋點、AOP切面、攔截器、Filter、事件監(jiān)聽、Micrometer+Prometheus,具有一定的參考價值,感興趣的可以了解一下2025-07-07
實例講解Java中random.nextInt()與Math.random()的基礎用法
今天小編就為大家分享一篇關于實例講解Java中random.nextInt()與Math.random()的基礎用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02

