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

Java 中的 sleep、wait、join 怎么理解

在 Java 中,sleep()、wait() 和 join() 都是与线程同步和控制相关的常用方法,它们各自有不同的功能和使用场景。以下是它们的区别和联系的详细分析:

sleep()

sleep() 是 Thread 类中的静态方法,用于让当前线程暂停执行指定的时间,并进入 阻塞状态。暂停期间,线程仍然持有任何锁,也就是说,sleep() 不会释放对象锁。

使用场景:常用于让线程暂时休眠一段时间。

主要特点:
线程在指定的时间结束后会自动恢复运行。

sleep() 不释放线程已经持有的锁,只是会让出时间片,其他线程获取不到这个线程的资源 。

可以被 interrupt() 方法打断,从而抛出InterruptedException。

wait()

wait() 是 Object 类中的方法,用于让线程等待,直到其他线程调用同一对象的 notify() 或 notifyAll() 方法,才能继续执行。调用 wait() 时,线程会进入 等待状态,并且会释放它持有的 对象锁。

使用场景:通常用于线程间通信,允许一个线程等待另一个线程的执行结果或通知。

public final void wait() throws InterruptedException
public final void wait(long timeout) throws InterruptedException

主要特点:
线程必须在持有对象的锁(即在 synchronized 块内)时才能调用 wait()。
调用 wait() 后,线程会释放对象锁并进入等待状态,直到其他线程调用 notify() 或 notifyAll()。
wait() 必须和 notify() 或 notifyAll() 搭配使用。
可以设置超时时间来自动唤醒等待线程。
示例:

synchronized (lock) {lock.wait(); // 当前线程进入等待,并释放锁// 被唤醒后继续执行
}

join()

join() 是 Thread 类中的方法,用于让调用线程等待另一个线程完成执行。换句话说,调用某个线程的 join() 方法会让当前线程暂停,直到被调用的线程执行完毕。

使用场景:常用于确保一个线程的执行完毕之后,其他线程才能继续执行。

public final void join() throws InterruptedException
public final void join(long millis) throws InterruptedException

主要特点:
线程 A 调用线程 B 的 join() 方法时,线程 A 会进入阻塞状态,直到线程 B 执行完毕。
join() 可以设置超时时间,指定等待时间后,线程 A 可以继续执行,即使线程 B 未结束。
可以被 interrupt() 方法打断,抛出 InterruptedException。
示例:

Thread t = new Thread(() -> {// 线程执行逻辑
});
t.start();
t.join(); // 当前线程等待 t 线程执行完毕后再继续执行

http://www.mrgr.cn/news/29531.html

相关文章:

  • 数字后端教程之Innovus report_property和get_property使用方法及应用案例
  • 在 Service Worker 中caches.put() 和 caches.add()/caches.addAll() 方法他们之间的区别
  • dolphinscheduler
  • 1小时构建Vue3知识体系之vue的生命周期函数
  • 物联网技术及其在智慧城市中的应用
  • goframe开发一个企业网站 rabbitmq队例15
  • Verdin AM62 引脚复用配置
  • 【MySQL】MySQL连接池原理与简易网站数据流动是如何进行
  • yaml注入配置文件
  • IEEE-754 32位十六进制数 转换为十进制浮点数
  • 游戏开发应具备的心理学知识
  • 【Python机器学习】NLP信息提取——正则模式
  • Kubernetes从零到精通(12-Ingress、Gateway API)
  • Sqlmap中文使用手册 - File system access模块参数使用
  • 米壳AI:跨境电商必备:不损失原图的图片翻译工具!
  • 感谢问界M9一打二十,让我们买到这么便宜的BBA
  • element-ui 日期选择器设置禁用日期
  • Games101图形学笔记——着色
  • day22JS-对象静态方法
  • 如何编写可维护的代码:最佳实践与技巧
  • 克隆centos网卡uuid相同如何修改
  • 进程的重要函数
  • 基于树表的查找
  • 网络封装分用
  • OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)
  • 伪工厂模式制造敌人