当前位置: 首页 > 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()还会释放对象锁。

 

http://www.dtcms.com/a/198176.html

相关文章:

  • [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
  • Linux编译rpm包与deb包
  • 用 UniApp 开发 TilePuzzle:一个由 CodeBuddy 主动驱动的拼图小游戏
  • 基于Spring Cloud Sentinel自研Slot扩展实战
  • MATLAB安装常见问题解决方案
  • English Speech Draft: Rebuilding Security in Modern Relationships
  • 一文读懂----Docker 常用命令
  • 低代码AI开发新趋势:Dify平台化开发实战
  • 相机基础常识
  • 【Java学习笔记】【第一阶段项目实践】房屋出租系统(面向对象版本)
  • 探索 Python 的利器:help()、dir() 与 AI 工具的结合应用