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ù)具體場景選擇合適的方法,并理解它們的不同行為和特點。
到此這篇關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的文章就介紹到這了,更多相關(guān)Java Sleep()方法與Wait()方法的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中sleep方法和wait方法的五個區(qū)別
- Java線程中sleep和wait的區(qū)別詳細介紹
- Java中sleep()與wait()的區(qū)別總結(jié)
- 詳解Java中wait和sleep的區(qū)別
- 詳解Java中的sleep()和wait()的區(qū)別
- Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)
- java sleep()和wait()的區(qū)別點總結(jié)
- Java詳細分析sleep和wait方法有哪些區(qū)別
- java面試突擊之sleep和wait有什么區(qū)別詳析
- Java中wait()與sleep()兩者的不同深入解析
相關(guān)文章
IntelliJ IDEA 設置代碼提示或自動補全的快捷鍵功能
這篇文章主要介紹了IntelliJ IDEA 設置代碼提示或自動補全的快捷鍵功能,需要的朋友可以參考下2018-03-03Spring @ComponentScan注解使用案例詳細講解
@ComponentScan注解的作用可以簡述為:將項目中所有被@Component注解直接或者間接標記的類---->組裝成BeanDefinition---->然后以key=beanName, value=BeanDefinition的形式存儲,為后續(xù)生成bean對象做準備2023-03-03java使用BeanUtils.copyProperties方法對象復制同名字段類型不同賦值為空問題解決方案
這篇文章主要給大家介紹了關(guān)于java使用BeanUtils.copyProperties方法對象復制同名字段類型不同賦值為空問題的解決方案,文中通過代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11SSM框架中entity mapper dao service controll
這篇文章主要介紹了SSM框架中entity mapper dao service controller層的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11