多线程(五)wait()和sleep()的异同

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();
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值