1.来自不同的类
- wait() ==>Object类
- sleep() ==>Thread类
2.关于锁的释放
sleep()是使线程休眠,不释放锁;wait方法是在获取锁情况下进行等待的,等待时会释放锁;
3.使用的范围
sleep()可以在任何地方使用,wait ()只能在同步代码块(synchronized) 使用,否则会抛 IllegalMonitorStateException异常
4.使进程进入的状态
sleep()会使得线程进入TIME_WAITING状态,而wait()会使得线程进入WAITING状态
5.唤醒线程的方式
sleep()方法是等待特定的时间自己会自动苏醒,继续执行自己的方法;而wait()方法必须有其他线程执行notify()或者notifyAll()方法,线程才会唤醒,否则该线程一直等待。(这里说的前提是线程没有被中断,中断就停了,也没了sleep()和wait()😄)
6.相同点:都需要捕获InterruptedException异常,也都可以响应中断
当线程执行中断方法后,无论是执行wait()还是sleep()方法,都会以为InterruptedException进入catch异常里面,执行catch里面的命令,然后线程中断,死亡。
/**
* @author LCW
* @since 2020/11/19 19:01
**/
public class Test {
public static void main(String[] args) throws InterruptedException {
//sleep()测试
Thread t1 = new Thread(() -> {
System.out.println("执行sleep()方法");
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
System.out.println("sleep()方法中断结束");
}
});
t1.start();
TimeUnit.SECONDS.sleep(3);
System.out.println("中断sleep()");
t1.interrupt();
TimeUnit.SECONDS.sleep(3);
//wait()测试
Object lock = new Object();
Thread t2 = new Thread(() -> {
synchronized(lock) {
System.out.println("执行wait()方法");
try {
lock.wait();
} catch (InterruptedException e) {
System.out.println("wait()方法中断结束");
}
}
});
t2.start();
TimeUnit.SECONDS.sleep(3);
System.out.println("中断wait()");
t2.interrupt();
}
}