当前位置: 首页 > news >正文

java中sleep()和wait()暂停线程的区别

1. Thread.sleep()

  • 所属类:它是Thread类的静态方法。
  • 作用:让当前正在执行的线程暂停指定的时间,在暂停期间,线程会一直持有对象锁(也就是synchronized锁)。
  • 中断响应:当线程处于sleep()状态时,如果被其他线程中断(调用interrupt()方法),线程会立刻抛出InterruptedException,同时会清除中断状态
  • 代码示例
    public class SleepTest {public static void main(String[] args) {Thread t = new Thread(() -> {try {System.out.println("线程开始休眠");Thread.sleep(5000); // 休眠5秒System.out.println("线程休眠结束");} catch (InterruptedException e) {System.out.println("线程休眠被中断: " + e.getMessage());Thread.currentThread().interrupt(); // 重新设置中断状态}});t.start();// 2秒后中断线程try {System.out.println("主线程休眠");Thread.sleep(2000);} catch (InterruptedException e) {}t.interrupt();}
    }
    
  • 输出结果
    主线程休眠
    线程开始休眠
    线程休眠被中断: sleep interrupted
    

2. Object.wait()

  • 所属类:它是Object类的实例方法。
  • 作用:使当前线程释放对象锁,并进入该对象的等待池,直到其他线程调用相同对象的notify()notifyAll()方法。
  • 中断响应:当线程处于wait()状态时,如果被其他线程中断,线程会立刻抛出InterruptedException,同时会释放对象锁并清除中断状态。
  • 代码示例
    public class WaitTest {private static final Object lock = new Object();public static void main(String[] args) {Thread t = new Thread(() -> {synchronized (lock) {try {System.out.println("线程开始等待");lock.wait(); // 等待其他线程唤醒System.out.println("线程等待结束");} catch (InterruptedException e) {System.out.println("线程等待被中断: " + e.getMessage());Thread.currentThread().interrupt(); // 重新设置中断状态}}});t.start();// 2秒后中断线程try {System.out.println("主线程休眠");Thread.sleep(2000);} catch (InterruptedException e) {}t.interrupt();}}
    
  • 输出结果
    主线程休眠
    线程开始等待
    线程等待被中断: wait interrupted
    

3. 核心区别

对比项Thread.sleep()Object.wait()
锁的释放不释放对象锁释放对象锁
唤醒方式时间结束自动唤醒或被中断必须由其他线程调用notify()/notifyAll()唤醒或被中断
使用场景线程暂时休眠线程间的协作与通信
同步块要求不需要在synchronized块中调用必须在synchronized块中调用

4. 注意事项

  • 中断处理:一旦捕获到InterruptedException,要根据实际需求处理中断,比如终止线程或者恢复执行。
  • 锁的管理wait()在释放锁后,需要重新获取锁才能继续执行后续代码。
  • 线程状态sleep()会使线程进入TIMED_WAITING状态,而wait()可能让线程进入WAITINGTIMED_WAITING状态。

总之,sleep()主要用于线程的短暂暂停,不释放对象锁,而wait()则用于线程间的交互,会释放对象锁。在中断处理方面,两者都会抛出异常,但wait()还会释放对象锁。

 

相关文章:

  • [Java实战]Spring Boot整合Elasticsearch(二十六)
  • 大模型微调步骤整理
  • 第9章 组件及事件处理
  • Mac 在恢复模式下出现 旋转地球图标 但进度非常缓慢
  • Oracle 内存优化
  • java中的Servlet3.x详解
  • sparkSQL读入csv文件写入mysql
  • 10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析
  • 多模态大语言模型arxiv论文略读(八十一)
  • SuperYOLO:多模态遥感图像中的超分辨率辅助目标检测之论文阅读
  • 贪心算法应用:最大匹配问题详解
  • 算法岗实习八股整理——深度学习篇(不断更新中)
  • 软件工程各种图总结
  • MySQL开发规范
  • 互联网大厂Java面试:从Spring到微服务的深度探讨
  • 大模型deepseek与知识图谱的实践
  • 【数据结构】2-3-3单链表的查找
  • 离散文本表示
  • spark数据处理练习题详解【下】
  • [论文品鉴] DeepSeek V3 最新论文 之 MHA、MQA、GQA、MLA
  • 1至4月国家铁路发送货物12.99亿吨,同比增长3.6%
  • 上海百年龙华码头开启新航线,弥补浦江游览南段空缺
  • 光明日报社副总编辑薄洁萍调任求是杂志社副总编辑
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 俄媒:俄乌代表团抵达谈判会场
  • 李峰已任上海青浦区委常委