八股文之sleep和wait方法的区别

        在Java中,sleep()和wait()方法都能暂停线程的执行,但它们有一些不同之处。

        1、sleep属于Thread类中的static方法而wait属于Object类的方法。

        2、等待条件是否存在:sleep()方法只是单纯地暂停当前线程的执行,而不关心任何线程间的通信。而wait()方法则需要等待其他线程发送一个notify()或者notifyAll()通知信号,以告知该线程可以继续执行下去了。

        3、 锁的持有:sleep()方法不会释放锁,即使当前线程持有某个对象的锁,调用该对象的sleep()方法也不会导致这个锁被释放掉。而在调用wait()方法时,当前线程必须拥有该对象的锁,并在等待期间会释放锁,以让其他线程可以获得锁并修改对象状态。

        4、异常处理:sleep()方法会休眠指定时间后自动恢复执行,而wait()方法最好要结合notify()或notifyAll()使用,否则可能会因为死锁、饿死等问题一直处于等待状态        sleep属于TIMED_WAITING,自动被唤醒;wait属于WAITING,需要手动唤醒。

以下是示例代码:

// sleep()方法的示例
public class SleepDemo {
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 5; i++) {
            System.out.println("Current count: " + i);
            Thread.sleep(1000);  // 休眠1秒钟
        }
    }
}

// wait()方法的示例
public class WaitDemo {
    public static void main(String[] args) throws InterruptedException {
        Object lockObject = new Object();
        synchronized (lockObject) {
            System.out.println("准备等待通知信号");
            lockObject.wait();  // 等待通知信号
            System.out.println("收到了通知信号,继续执行");
        }
    }
}

        在以上示例代码中,SleepDemo类使用sleep()方法暂停了当前线程一段时间,WaitDemo类使用wait()方法来进行线程间的通信。WaitDemo类必须在持有lockObject对象的锁的前提下才能调用wait()方法,并等待其他线程发送通知信号。当其他线程调用notify()或者notifyAll()方法时,WaitDemo类就可以收到信号并继续执行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值