Java wait()和sleep()的区别

sleep(): 此方法用于将当前线程的执行暂停指定的时间(以毫秒为单位)。在这里,Thread 不会失去对监视器的所有权并恢复其执行
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: milliseconds,sleep(long millis,int nanos) nanos: Nanoseconds
public final void wait(long timeout) public static void sleep(long millis) throws Interrupted_Execption

sleep()方法示例:
 

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
}

wait()方法示例:

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

wait() 和 sleep() 方法之间的相似性:

  • 两者都使当前线程进入不可运行状态。
  • 两者都是本机方法。

以下用于调用 wait() 和 sleep() 方法的代码片段:

synchronized(monitor){
    while(condition == true)
    {
        monitor.wait() //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep
}
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: milliseconds,sleep(long millis,int nanos) nanos: Nanoseconds
public final void wait(long timeout) public static void sleep(long millis) throws Interrupted_Execption

sleep()方法示例:

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
}
`

Java

wait()方法示例:

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

Java

wait() 和 sleep() 方法之间的相似性:

  • 两者都使当前线程进入不可运行状态。
  • 两者都是本机方法。

以下用于调用 wait() 和 sleep() 方法的代码片段:

synchronized(monitor){
    while(condition == true)
    {
        monitor.wait() //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep
}

Java

示例2:

// 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");
    }
}
}

 

你可能感兴趣的