您的位置:首页 > 移动开发 > Objective-C

Object wait方法

2017-02-04 14:54 225 查看
概述

当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁。

但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码。等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,让线程A从等待状态变成执行状态,继续执行代码。

有些同学认为线程A也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗CPU,而且也不知道条件何时才能满足。

线程之间要协调沟通,必须有一个等待机制和通知机制,在
JAVA
里面,对应的就是
wait
方法和
notify
方法。

Object的wait方法

synchronized (obj) {
while (condition does not ok){
obj.wait();
}
}


如果想让线程A处于等待状态,可以调用当前对象
wait
方法。wait方法一旦被调用,也就意味着:线程A已经获得锁了,而且能做的事情都已经做了,现在只能等待了,等待另外的同步操作执行某些代码后,我才回来继续干活。

注意:

wait
方法是定义在根类
Object
上的,Thread继承自
Object
类,自然也有
wait
方法。但是这里并不是调用当前线程对象的
wait
方法,而是具有锁属性的当前对象的
wait
方法;这一点我也不太理解,我觉得要做到线程A切换到等待状态,之后被人唤醒,就算使用线程A的
wait
方法和
notify
方法其实也是可以做到的,但是估计实现起来非常麻烦。另外从场景上看,
wait
定义在
Object
也比较合理,表示线程挂在了对象的等待池中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程
相关文章推荐