为了账号安全,请及时绑定邮箱和手机立即绑定

lockObj.notifyAll(); 说是唤醒所有在lockObj对象上等待的线程,energyBoxes[from] < amount那么肯定会出现有些线程这个条件不满足的啊,咋能唤醒全部线程呢?

lockObj.notifyAll(); 说是唤醒所有在lockObj对象上等待的线程,energyBoxes[from] < amount那么肯定会出现有些线程这个条件不满足的啊,咋能唤醒全部线程呢?

正在回答

8 回答

唤醒线程之后 线程就会重新执行一遍run语句块中的方法 而运行的代码中的“ while (energyBoxes[from] < amount)”代码就可以起到判断的作用 若不满足条件则继续等待

0 回复 有任何疑惑可以回复我~

wait()在条件不满足时调用,然后会释放掉锁,进入wait set等待,让其他的线程去竞争cpu资源,当其他的线程操作引起条件的变化时,则会notifyAll()唤醒所有在wait set中等待的线程,重新判断条件是否满足,满足则获取资源,不满足继续进入wait set等待

2 回复 有任何疑惑可以回复我~

没错,所有waitSet中的线程都会被唤醒,并且同一时刻只有一条线程竞争到CPU资源,

然后开始执行transfer方法:如果还是不满足if条件,继续回去等待;满足了就执行transfer操作。

然后下一个线程刚被唤醒的线程继续进入CPU。

1 回复 有任何疑惑可以回复我~

不满足这个条件就不会wait(),所以就不需要唤醒啊

0 回复 有任何疑惑可以回复我~

唤醒所有线程,然后重新进行一次判断,不满足的再次进入阻塞

2 回复 有任何疑惑可以回复我~

我猜是,energyBoxes[from]<amount的线程在失去锁进入wait set后,线程本身没有停下来只是不能操作被锁的内存区域,但是线程能获得新的amount(等于刷新自己的amount),也不知道对不对


0 回复 有任何疑惑可以回复我~

就像生产车间的库存商品一样,存货不足时买家来进货就只能进入等待,刚生产一件又有另外一个买家来进货,又只能进入等待,直到收到通知有货了买家才来买。这里的notifyAll就是通知了所有人

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

lockObj.notifyAll(); 说是唤醒所有在lockObj对象上等待的线程,energyBoxes[from] < amount那么肯定会出现有些线程这个条件不满足的啊,咋能唤醒全部线程呢?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信