sleep()和wait()的区别

9 篇文章 0 订阅

在Java中,sleep()wait()方法都用于线程暂停执行,但是它们在用途、所在对象以及唤醒机制上有着重要的区别。它们的主要区别如下:

  1. 用途:sleep()方法是Thread类的一部分,用于让当前线程暂停执行一段时间。这个方法是非常通用的,可以用于任何线程。 wait()方法是Object类的一部分,用于让当前线程等待,直到另一个线程调用该对象的notify()或notifyAll()方法。通常在多线程协作中使用。

  2. 所在对象:sleep()方法是Thread类的静态方法,不需要对象即可调用。 wait()是一个实例方法,必须在一个对象上调用。所有对象都有这个方法,因为Object类是所有类的基类。

  3. 锁的释放:在调用wait()方法后,线程会释放它所持有的对象锁,允许其他线程访问该对象。而在调用sleep()方法后,线程不会释放锁,其他线程无法访问该对象。

  4. 唤醒条件:调用wait()方法后,需要其他线程调用相同对象的notify()或notifyAll()方法来唤醒等待的线程。而调用sleep()方法后,线程会在指定的时间结束后自动恢复执行。

  5. 异常处理:sleep()方法在等待过程中可以被中断,即其他线程可以调用interrupt()方法来中断正在休眠的线程,从而抛出InterruptedException异常。而wait()方法必须在synchronized块或方法中使用,因此当其他线程执行相同对象的notify()或notifyAll()方法时,等待的线程将重新竞争锁,如果竞争成功,则继续执行,如果竞争失败,则仍然处于等待状态。

以下是一个简单的示例来说明wait()sleep()的区别:

public class Test {  
    public static void main(String[] args) throws InterruptedException {  
        Thread t = new Thread(() -> {  
            try {  
                // 使用 sleep() 方法,线程会暂停执行5秒然后继续执行  
                Thread.sleep(5000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("Thread resumed after sleep");  
        });  
        t.start();  
        t.join(); // 确保主线程等待新线程执行完毕  
        System.out.println("Main thread continues...");  
    }  
}

上面的代码创建了一个新的线程,该线程首先会暂停5秒(使用sleep()方法),然后输出一条消息。主线程会等待这个新线程执行完毕后,输出另一条消息。

而下面的示例展示了wait()notify()的用法:

public class Test {  
    private static Object lock = new Object();  
    public static void main(String[] args) throws InterruptedException {  
        Thread t1 = new Thread(() -> {  
            synchronized (lock) {  
                try {  
                    // 使用 wait() 方法,线程会暂停执行,直到其他线程调用 lock 的 notify() 或 notifyAll() 方法  
                    lock.wait();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                System.out.println("Thread resumed after wait");  
            }  
        });  
        t1.start();  
        t1.join(); // 确保主线程等待新线程执行完毕  
        synchronized (lock) {  
            System.out.println("Main thread continues..."); // 输出后,唤醒 t1 线程  
            lock.notify(); // 唤醒在此对象上等待的线程  
        }  
    }  
}

在这个示例中,我们创建了一个新的线程t1,它在一个同步块中等待(使用wait()方法)。主线程先执行,当它输出一条消息时,它会调用notify()方法唤醒在此对象(lock)上等待的线程t1。然后t1继续执行并输出另一条消息。

总之,sleep()用于暂停线程的执行一段时间,不释放锁,无需其他线程的干预;而wait()用于使线程进入等待状态,释放锁,需要其他线程调用notify()或notifyAll()方法来唤醒等待的线程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值