黑马程序员技术交流社区
标题:
关于wait()和notify()
[打印本页]
作者:
kongling
时间:
2013-12-15 22:16
标题:
关于wait()和notify()
wait()和notify()方法为什么设计在Object类中?有什么想法吗?
作者:
雨的印记yp
时间:
2013-12-16 01:04
这两个方法必须用在同步中,即必须有锁。因为要有锁的操作,也就是要被锁调用,例如
synchronized(lock){
lock.wait();
lock.notify();
}
因为锁是任意类的对象,只有定义在Object类中,该类才会继承这两个方法然后被其对象调用。
所以这两个方法定义在Object类中而不是Thread类中。
作者:
zeratel3000
时间:
2013-12-16 10:39
本帖最后由 zeratel3000 于 2013-12-16 10:40 编辑
wait之后通过noitfy来解锁,这样所有的对象都可以上锁,wait,noitfy
作者:
还记得梦想吗
时间:
2013-12-17 00:39
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()方法后线程马上释放对象的对象锁。
作者:
末末
时间:
2013-12-17 00:41
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,只 有同一个锁上的被等待线程,可以被同一个锁上notify唤醒
不可以对不同锁中的线程进行唤醒
也就是说,等待和唤醒必须是现一个锁
而锁可以是任意对象,所以可以被任意对象调用的方法定义在object类中
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2