當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java wait和sleep的區別用法及代碼示例


Sleep():此方法用於將當前線程的執行暫停指定時間(以毫秒為單位)。在這裏,線程不會失去其對監視器的所有權並恢複其執行

Wait():該方法在對象類中定義。它告訴調用線程(也稱為當前線程)等待,直到另一個線程調用該對象的notify()或notifyAll()方法,該線程等待,直到它重新獲得監視器的所有權並恢複執行。

Wait() Sleep()
Wait()方法屬於Object類。 Sleep()方法屬於Thread類。
Wait()方法在同步期間釋放鎖。 Sleep() 方法在同步期間不會釋放對象上的鎖。
Wait() 隻能從同步上下文中調用。 無需從同步上下文中調用sleep()。
Wait() 不是靜態方法。 Sleep() 是靜態方法。

Wait() 有三個重載方法:

  • wait()
  • wait(long timeout)
  • wait(long timeout, int nanos)

Sleep() 有兩個重載方法:

  • sleep(long millis)millis: 毫秒
  • sleep(long millis,int nanos) 納秒:納秒
公共最終無效等待(長時間超時) 公共靜態無效睡眠(長毫秒)拋出Interrupted_Execption

睡眠方法示例:

synchronized(monitor)
{
Thread.sleep(1000);  Here Lock Is Held By The Current Thread
//after 1000 milliseconds, current thread will wake up, or after we call that is interrupt() method
}

等待方法示例:

synchronized(monitor)
{
monitor.wait()  Here Lock Is Released By Current Thread 
}

wait() 和 sleep() 方法之間的相似之處:

  1. 兩者都會使當前線程進入不可運行狀態。
  2. 兩者都是本機方法。

以下代碼片段用於調用 wait() 和 sleep() 方法:

Java


synchronized(monitor){
    while(condition == true)
    { 
        monitor.wait()  //releases monitor lock
    }
    Thread.sleep(100); //puts current thread on Sleep    
}

Difference-between-wait-and-sleep-in-Java

程序:

Java


// Java program to demonstrate the difference 
// between wait and sleep 
class GfG{
   
private static Object LOCK = new Object();
public static void main(String[] args) 
  throws InterruptedException {
  
    Thread.sleep(1000);
   
    System.out.println("Thread '" + Thread.currentThread().getName() +
      "' is woken after sleeping for 1 second");
  
    synchronized (LOCK) 
    {
        LOCK.wait(1000);
       
        System.out.println("Object '" + LOCK + "' is woken after" +
          " waiting for 1 second");
    }
}
}


輸出
Thread 'main' is woken after sleeping for 1 second
Object 'java.lang.Object@1d81eb93' is woken after waiting for 1 second


相關用法


注:本文由純淨天空篩選整理自nishanthec19大神的英文原創作品 Difference between wait and sleep in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。