按照惯例我们还是来看注释怎么说吧:
wait方法:
notify方法:
notifyAll()方法:
看完上面的注释我们可以总结以下的要点:
- 无论是wait、notify还是notifyAll()都需要由监听器对象(锁对象)来进行调用
- 简单来说:他们都是在同步代码块中调用的,否则会抛出异常!
- notify()唤醒的是在等待队列的某个线程(不确定会唤醒哪个),notifyAll()唤醒的是等待队列所有线程
- 导致wait()的线程被唤醒可以有4种情况
- 该线程被中断
- wait()时间到了
- 被notify()唤醒
- 被notifyAll()唤醒
- 调用wait()的线程会释放掉锁
5.1为什么wait和notify在Object方法上?
从一开始我们就说了:wait()和notify()是Java给我们提供线程之间通信的API,既然是线程的东西,那什么是在Object类上定义,而不是在Thread类上定义呢?
- 锁对象是任意的,所以这些方法必须定义在Object类中
上面已经说了,notify会唤醒某个处于等待队列的线程 。
但是要注意的是:
- notify方法调用后,被唤醒的线程不会立马获得到锁对象 。而是等待notify的synchronized代码块执行完之后才会获得锁对象
Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权 。
- 主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制 。
- 而Thread.sleep()没有对锁释放
推荐阅读
- 小编分享在win7电脑里将appdata文件夹删掉的图文操作。
- 攻城掠地上貂蝉换什么将,游戏中的神还原貂蝉
- 卧龙吟武将兵力怎么调,《卧龙吟》推图细节分析
- 小编教你win7电脑将efi系统分区删掉的详细操作。
- 小编教你爆米花视频APP将视频下载下来的操作流程。
- 我来教你中华万年历APP将通知栏天气关掉的操作流程。
- 我来教你win7系统将禁用加载项取消的详细操作。
- 教你摩擦APP将聊天消息置顶的操作流程。
- 分享天天漫画APP将漫画删掉的简单操作。
- 小编分享在相机360里将特效收藏起来的基础操作。