A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kongling 中级黑马   /  2013-12-15 22:16  /  1316 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

wait()和notify()方法为什么设计在Object类中?有什么想法吗?

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

4 个回复

倒序浏览
这两个方法必须用在同步中,即必须有锁。因为要有锁的操作,也就是要被锁调用,例如
synchronized(lock){
   lock.wait();
   lock.notify();
}
因为锁是任意类的对象,只有定义在Object类中,该类才会继承这两个方法然后被其对象调用。
所以这两个方法定义在Object类中而不是Thread类中。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 zeratel3000 于 2013-12-16 10:40 编辑

wait之后通过noitfy来解锁,这样所有的对象都可以上锁,wait,noitfy
回复 使用道具 举报
Object类下的方法:     java 所有类都是Object的子类。。。 所以每个对象都可以上锁 唤醒wait()和notify()
1. getClass()
2. hashCode()
3. equals()
4. toString()
5. clone()
6. wait()...
7. notify()
8. notifyAll()
9. finalize()

wait()和notify()方法是Object类中的两个方法。
除了使用synchronized关键字来协调线程之间的执行状态,还可以使用这两个方法以另外一种方式来协调线程。这两个方法是非静态的,因为这两个方法是Object类中的方法,所以通过继承,Java中所有的实例都可以调用这两个方法。

   wait()方法:它让执行此代码的线程进入挂起状态。如果在处于挂起状态时,因为某些原因挂起被打断了,那么该方法就会抛出一个InterruptedException的异常,这个异常和sleep方法抛出的异常是同一个类型。


  notify()方法:唤醒因为在同一个对象上调用wait()而处于挂起状态的线程,让线程可以继续执行下去。
   同一个对象:因为在同一个对象上调用wait()方法而进入等待状态的线程,只能由另一个线程在同一个对象上调用notify方法来唤醒。举例来说,obj是一个指向类Object的实例的引用,线程1调用obj.wait()方法而进入挂起状态,

如果想唤醒这个线程,只能够在指向同一个类Object实例上调用notify方法才可以   调用方法的要求:必须在获得一个对象的锁的代码内部才能调用这个对象的wait()或者notify()方法。也就是说,如果要调用一个对象的wait()或者notify()方法,那么就首先需要使用synchronized代码块获得这个对象的锁,否则程序将抛出一个IllegalMoniterStateException异常。
   当调用wait()方法后线程马上释放对象的对象锁。


评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,只 有同一个锁上的被等待线程,可以被同一个锁上notify唤醒
不可以对不同锁中的线程进行唤醒
也就是说,等待和唤醒必须是现一个锁
而锁可以是任意对象,所以可以被任意对象调用的方法定义在object类中

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马