java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java wait()和sleep()区别

Java中wait()和sleep()区别小结

作者:IT橘子皮

在Java多线程编程中,wait()和 sleep()是两个常用的线程控制方法,但它们在工作原理、使用场景和效果上有显著区别,本文就来详细的介绍一下两者的差异,感兴趣的可以了解一下

在 Java 多线程编程中,wait()sleep()是两个常用的线程控制方法,但它们在工作原理、使用场景和效果上有显著区别。以下是两者的主要差异:

1. 所属类与基本性质

2. 锁的行为差异(核心区别)

3. 使用场景

4. 唤醒机制

5. 调用前提条件

6. 异常处理

两者都会抛出 InterruptedException

7. 线程状态变化

代码示例对比

sleep() 示例(不释放锁)

synchronized (lock) {
    System.out.println("线程获取锁,开始sleep");
    try {
        Thread.sleep(2000); // 休眠2秒,不释放lock锁
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("线程sleep结束");
}
// 其他线程必须等待sleep结束后才能获取锁

wait() 示例(释放锁)

synchronized (lock) {
    System.out.println("线程获取锁,开始wait");
    try {
        lock.wait(); // 释放lock锁,进入等待队列
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("线程被唤醒,重新获取锁");
}
// 其他线程可以在wait期间获取lock锁

总结对比表

特性sleep()wait()
所属类Thread类的静态方法Object类的实例方法
锁释放不释放锁释放锁
使用场景线程暂停执行线程间通信与协作
唤醒方式自动唤醒(时间到)notify()/notifyAll()唤醒
调用前提无需同步环境必须在 synchronized中调用
异常InterruptedExceptionInterruptedException+ IllegalMonitorStateException
典型用途定时、延迟生产者-消费者、条件等待

关键结论

  1. 锁行为​:sleep()持有锁不放,wait()释放锁——这是最本质的区别。
  2. 协作机制​:wait()/notify()是 Java 多线程协作的基础机制,而 sleep()只是单纯的线程暂停。
  3. 使用规范​:误用 wait()(如不在同步块中调用)会导致运行时异常,而 sleep()的使用相对简单。

在实际开发中,应根据是否需要线程间协作来选择使用哪个方法:若只是需要延迟,用 sleep();若需要等待某个条件满足(如资源就绪),则用 wait()

到此这篇关于Java中wait()和sleep()区别小结的文章就介绍到这了,更多相关Java wait()和sleep()区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文