Java中的`Object`类提供了`wait()`方法,这是Java多线程编程中一个至关重要的功能,它与`notify()`和`notifyAll()`一起用于线程间的协作。`wait()`方法主要用于实现线程的等待和唤醒机制,允许线程在特定条件下暂停执行并释放所持有的锁,从而让其他等待该锁的线程有机会获取并执行。 ### 等待和唤醒机制 在Java中,线程间的通信和同步主要依赖于`synchronized`关键字和`wait()`, `notify()`, `notifyAll()`这三个方法。`synchronized`用于控制对共享资源的访问,确保同一时间只有一个线程可以执行特定的代码块。 - **线程等待**:当一个线程执行到`wait()`方法时,它会释放当前持有的锁,并进入对象的等待池,等待其他线程的唤醒。在这个状态下,线程不再参与对锁的争夺,直到被`notify()`或`notifyAll()`唤醒。 - **线程唤醒**:`notify()`和`notifyAll()`方法用于唤醒等待在对象监视器上的线程。`notify()`只会随机唤醒一个等待的线程,而`notifyAll()`则会唤醒所有等待的线程。唤醒的线程并不会立即恢复执行,而是要重新竞争锁,只有赢得锁的线程才能从`wait()`状态恢复并继续执行。 ### 使用示例 ```java public class WaitNotifyExample { private final Object lock = new Object(); private boolean condition; public void doSomething() { synchronized (lock) { while (!condition) { try { // 当条件不满足时,线程A调用wait,释放锁并等待 lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 条件满足,线程A继续执行 // ... 执行相关逻辑 ... } } public void setCondition() { synchronized (lock) { // 修改条件,使得线程A可以继续执行 condition = true; // 唤醒等待在lock对象上的线程 lock.notifyAll(); } } } ``` 在上述示例中,`doSomething()`方法会检查条件`condition`,如果不满足,则调用`wait()`,释放锁并进入等待状态。当其他线程(例如`setCondition()`)修改了条件并调用`notifyAll()`时,所有等待的线程(包括线程A)都会尝试重新获取锁,只有一个会成功并继续执行。 ### 注意事项 1. `wait()`, `notify()`, `notifyAll()`方法必须在`synchronized`代码块或方法中调用,因为它们涉及到对象的监视器(monitor),这是由锁来实现的。如果在非同步环境中调用,会抛出`IllegalMonitorStateException`。 2. 调用`wait()`的线程必须是持有锁的线程,否则也会抛出`IllegalMonitorStateException`。 3. `wait()`方法会抛出`InterruptedException`,当线程在等待期间被中断时,会抛出此异常。通常需要捕获并处理这个异常。 4. `wait()`方法会使当前线程进入可中断的等待状态,这意味着可以通过中断线程来结束等待。 5. 为了避免死锁,使用`wait()`、`notify()`和`notifyAll()`时需要谨慎,确保线程在适当的时候释放锁并唤醒其他线程。 6. 使用`while`循环检查条件而不是`if`,是为了防止虚假唤醒(spurious wakeups)。尽管Java规范保证了`wait()`会被正确唤醒,但使用`while`循环可以增加代码的健壮性。 7. 调用`wait()`后,线程不会立即释放锁,而是在`wait()`方法返回前释放。因此,线程在等待期间不会占用锁资源。 通过深入理解`wait()`方法及其相关机制,可以更好地设计和实现多线程程序,确保线程间的协同工作和资源的有效利用。在实际开发中,合理运用这些方法可以提高程序的并发性能和响应性。
































- 粉丝: 9
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- seat-select微信小程序版本.zip
- 微信小程序-移动端商城.zip
- sprnigboot和微信小程序实现点餐系统(全栈开发之微信小程序点餐)(1).zip
- welCropper 微信小程序截图工具.zip
- 微信小程序上canvas绘制图片助手,一个json就制作分享朋友圈图片.zip
- 移动商城微信小程序.zip
- 微信小程序、公众号、H5等小的案例代码分享。.zip
- 微信小程序:音乐播放器 技术栈_ redux + es7 +labrador.zip
- 基于ROS_Noetic的仿真小车平台集成多种3D激光SLAM算法实现自主导航与建图_包含A_LOAM_LIO_SAM_LEGO_LOAM_FAST_LIO等开源算法_结合acke.zip
- 基于MATLAB平台的IMU传感器数据融合算法整理与优化项目_惯性测量单元数据预处理_卡尔曼滤波_互补滤波_四元数姿态解算_传感器误差补偿_多模型对比验证_用于无人机导航_机器人姿.zip
- vue+php+uniapp轻量级多语言易二开跨终端商城系统,低代码,完全前后端分离,免费开源可商用,H5商城电商平台,
- poster 微信小程序海报DEMO.zip
- 基于EastWorld的微信小程序商城.zip
- uni-app 课程表组件,微信小程序、QQ 小程序.zip
- 基于ROS系统的机械臂运动控制仿真项目_模拟运动控制卡实现NURBS插补算法_通过launch文件和xml语言进行系统定义与开发_集成moveit配置器与Python自定义轨迹脚本.zip
- [不再维护] 仿 「ONE · 一个」 的微信小程序.zip


