Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
在 Java 中,sleep() 和 wait() 方法都可以用來控制線程的執(zhí)行順序或等待特定條件的發(fā)生,但它們有著不同的使用場景和行為:
1. sleep()
- sleep() 方法來自于 Thread 類,用于讓當(dāng)前線程暫停執(zhí)行一段時(shí)間,以毫秒為單位。
- 調(diào)用 sleep() 方法會讓線程進(jìn)入阻塞狀態(tài),但不會釋放鎖。
- 通常用于模擬時(shí)間間隔、節(jié)流處理、或者簡單的等待。
示例用法:
try { Thread.sleep(1000); // 暫停當(dāng)前線程1秒鐘 } catch (InterruptedException e) { e.printStackTrace(); }
sleep() 方法是一個(gè)本地方法(native method),它會調(diào)用操作系統(tǒng)提供的功能來使當(dāng)前線程休眠指定的毫秒數(shù)。
當(dāng)調(diào)用 sleep() 方法時(shí),當(dāng)前線程會進(jìn)入 TIMED_WAITING 狀態(tài),直到指定的時(shí)間到達(dá)或者被中斷(InterruptedException)。
public static native void sleep(long millis) throws InterruptedException;
2. wait()
- wait() 方法來自于 Object 類,用于在多線程環(huán)境下實(shí)現(xiàn)線程間的協(xié)調(diào)與通信。
- 調(diào)用 wait() 方法會讓線程釋放對象鎖,并且進(jìn)入等待狀態(tài),直到其他線程調(diào)用相同對象上的 notify() 或 notifyAll() 方法來喚醒它,或者等待時(shí)間到達(dá)。
- 必須在同步塊或同步方法中調(diào)用 wait() 方法,否則會拋出 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)前線程釋放對象的鎖,并進(jìn)入 WAITING 或者 TIMED_WAITING 狀態(tài),直到被其他線程調(diào)用相同對象的 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é)
- 來源與使用對象:
- sleep() 是 Thread 類的靜態(tài)方法,用于讓當(dāng)前線程休眠一段時(shí)間。
- wait() 是 Object 類的方法,用于線程間的協(xié)調(diào)和通信。
- 鎖的釋放:
- sleep() 不會釋放鎖,線程仍然持有鎖。
- wait() 會釋放對象鎖,讓其他線程可以訪問這個(gè)對象的同步方法或塊。
- 喚醒機(jī)制:
- sleep() 時(shí)間到達(dá)或者被中斷時(shí)會自動喚醒。
- wait() 需要其他線程調(diào)用相同對象的 notify() 或 notifyAll() 方法來喚醒。
- 異常處理:
- sleep() 方法的中斷異常是 InterruptedException。
- wait() 方法的中斷異常也是 InterruptedException,但是在 wait() 中使用時(shí),建議使用循環(huán)檢查條件來避免虛假喚醒。
總結(jié)
sleep() 用于線程暫停執(zhí)行一段時(shí)間,適用于控制時(shí)間間隔;wait() 用于多線程間的協(xié)調(diào)和通信,適用于等待特定條件的發(fā)生。在使用時(shí)需要根據(jù)具體場景選擇合適的方法,并理解它們的不同行為和特點(diǎn)。
到此這篇關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的文章就介紹到這了,更多相關(guān)Java Sleep()方法與Wait()方法的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中sleep方法和wait方法的五個(gè)區(qū)別
- Java線程中sleep和wait的區(qū)別詳細(xì)介紹
- Java中sleep()與wait()的區(qū)別總結(jié)
- 詳解Java中wait和sleep的區(qū)別
- 詳解Java中的sleep()和wait()的區(qū)別
- Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)
- java sleep()和wait()的區(qū)別點(diǎn)總結(jié)
- Java詳細(xì)分析sleep和wait方法有哪些區(qū)別
- java面試突擊之sleep和wait有什么區(qū)別詳析
- Java中wait()與sleep()兩者的不同深入解析
相關(guān)文章
IntelliJ IDEA 設(shè)置代碼提示或自動補(bǔ)全的快捷鍵功能
這篇文章主要介紹了IntelliJ IDEA 設(shè)置代碼提示或自動補(bǔ)全的快捷鍵功能,需要的朋友可以參考下2018-03-03Spring @ComponentScan注解使用案例詳細(xì)講解
@ComponentScan注解的作用可以簡述為:將項(xiàng)目中所有被@Component注解直接或者間接標(biāo)記的類---->組裝成BeanDefinition---->然后以key=beanName, value=BeanDefinition的形式存儲,為后續(xù)生成bean對象做準(zhǔn)備2023-03-03java使用BeanUtils.copyProperties方法對象復(fù)制同名字段類型不同賦值為空問題解決方案
這篇文章主要給大家介紹了關(guān)于java使用BeanUtils.copyProperties方法對象復(fù)制同名字段類型不同賦值為空問題的解決方案,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11SSM框架中entity mapper dao service controll
這篇文章主要介紹了SSM框架中entity mapper dao service controller層的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringBoot設(shè)置接口超時(shí)的方法小結(jié)
這篇文章主要介紹了SpringBoot設(shè)置接口超時(shí)的方法小結(jié),包括配置文件,config配置類及相關(guān)示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例
這篇文章主要介紹了使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例,2048 游戲是一款益智類游戲,玩家需要通過合并相同數(shù)字的方塊,不斷合成更大的數(shù)字,最終達(dá)到2048,游戲規(guī)則簡單,但挑戰(zhàn)性很高,需要玩家靈活運(yùn)用策略和計(jì)算能力,本文將使用Java代碼實(shí)現(xiàn),需要的朋友可以參考下2023-10-10