wait和sleep的区别

发布时间 2023-04-06 01:02:21作者: 人在代码在

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