我见过很多例子,我们直接调用了wait()
和notify()
方法。
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
但在对象类中,notify的方法签名定义为
public final void notify()
有人可以解释我们如何在不使用对象的情况下直接调用这些方法,因为这些方法没有定义为静态。
答案 0 :(得分:1)
在java中,每个类直接或间接地扩展类Object。这就是为什么可以使用在类Object中定义的方法 - 例如 - wait(),notify(),equals(),hashcode()等。
检查this:
和this
答案 1 :(得分:0)
这些方法是Object类(每个类的超类)的一部分,因此这些方法在您编写的所有类中都被继承(隐式)。
来到静态部分,调用这些方法不需要它们是静态的,因为它们是你的类的一部分,因此当你说wait()时,你实际上意味着它被调用到正确的对象上。
答案 2 :(得分:0)
MethodName ( [ArgumentList] )
形式的方法调用表达式调用当前类的方法。如果该方法不是静态的,则在当前对象上调用它,即对象this
指向。也就是说,方法调用表达式notify()
只是写this.notify()
的简写。
notify()
的实现可以查询其this
以找出应该通知哪些对象的等待线程。