wait和sleep的区别

Posted zqlmianshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wait和sleep的区别相关的知识,希望对你有一定的参考价值。

1.wait就是在门口等,关上了门释放了锁。sleep就是抱着锁睡觉,锁还在我手里。

2.sleep来自thread类,wait来自object类。

3.sleep和wait都需要捕获异常,因为别的方法调用interrupt方法可以打断sleep并报错,如果不捕获就会出错。

4.wait方法用notify()方法唤醒。

5.wait只能在同步代码块内用,sleep可以随处用。

 

在Java中,wait和sleep都是用来暂停线程的方法,但是它们有着不同的用途和实现方式。

wait方法是Object类的方法,可以用来暂停线程,并且会释放对象锁,使得其他线程可以访问该对象。wait方法必须在synchronized块中调用,否则会抛出IllegalMonitorStateException异常。wait方法可以通过notify或notifyAll方法来唤醒线程。

下面是一个使用wait方法暂停线程的例子:

synchronized(object) 
    while (!condition) 
        object.wait();
    

sleep方法是Thread类的方法,可以用来暂停线程,但是不会释放对象锁。sleep方法可以在任何地方调用,不需要在synchronized块中。sleep方法会让线程进入阻塞状态,直到时间到了或者被中断才会返回。

下面是一个使用sleep方法暂停线程的例子:

try 
    Thread.sleep(1000);
 catch (InterruptedException e) 
    // handle the exception

总的来说,wait和sleep的区别如下:

  1. wait方法必须在synchronized块中调用,而sleep方法可以在任何地方调用。

  2. wait方法会释放对象锁,而sleep方法不会释放对象锁。

  3. wait方法可以通过notify或notifyAll方法来唤醒线程,而sleep方法只能等待时间到了或者被中断才会返回。

需要注意的是,在使用wait和sleep时,需要处理InterruptedException异常,以便于及时中断线程。

 

 

使用wait方法时也需要处理InterruptedException异常。因为在等待期间,线程可能会被中断,如果不处理这个异常,可能会导致应用程序出现问题。在使用wait方法时,可以使用以下代码来处理InterruptedException异常:

synchronized(object) 
    while (!condition) 
        try 
            object.wait();
         catch (InterruptedException e) 
            // handle the exception
        
    

当线程在wait状态下被中断时,会抛出InterruptedException异常,程序可以在catch块中处理这个异常,比如打印日志、设置标志位等操作。处理完异常后,线程会继续执行while循环,重新检查condition条件是否满足。

 

wait方法也会响应interrupt()方法,并在收到中断信号后抛出InterruptedException异常。当线程处于wait状态时,如果其他线程调用了该线程的interrupt()方法,那么该线程会被唤醒并抛出InterruptedException异常。

需要注意的是,当线程抛出InterruptedException异常时,它的中断状态会被清除。因此,在catch块中需要手动重置中断状态,以允许其他线程继续中断该线程。以下是一个使用wait方法响应interrupt()方法的示例代码:

synchronized(object) 
    while (!condition) 
        try 
            object.wait();
         catch (InterruptedException e) 
            Thread.currentThread().interrupt(); // 重置中断状态
            // handle the exception
        
    

在catch块中,我们首先重置了中断状态,然后再处理异常。这样做可以确保在异常处理完成后,线程的中断状态能够被其他线程正确处理。

sleep() 和 wait() 区别

sleep()不释放同步锁,wait()释放同步锁

  sleep()的作用是让线程休眠指定的时间,时间到后自动恢复线程执行。运行的主动权是由线程决定的。

  wait()可以用notify()直接唤起,运行的主动权在于控制者。

  

  sleep()是Thread的静态方法;

  wait()是OBJ的静态方法,Object.wait();Object.notify();

以上是关于wait和sleep的区别的主要内容,如果未能解决你的问题,请参考以下文章

wait方法和sleep方法的区别

wait方法和sleep方法的区别

sleep和wait有啥区别

JAVA-sleep和wait的区别

sleep()和wait()有啥区别

线程中sleep和wait的区别