wait()和notify()不是静态的,因此编译器应该给出必须从静态上下文调用wait的错误。
public class Rolls {
public static void main(String args[]) {
synchronized(args) {
try {
wait();
} catch(InterruptedException e)
{ System.out.println(e); }
}
}
}
但以下代码编译并正常运行。为什么编译器不会在这里给出错误?或者,为什么编译器会在先前的代码中给出必须从静态上下文调用wait的错误?
public class World implements Runnable {
public synchronized void run() {
if(Thread.currentThread().getName().equals("F")) {
try {
System.out.println("waiting");
wait();
System.out.println("done");
} catch(InterruptedException e)
{ System.out.println(e); }
}
else {
System.out.println("other");
notify();
System.out.println("notified");
}
}
public static void main(String []args){
System.out.println("Hello World");
World w = new World();
Thread t1 = new Thread(w, "F");
Thread t2 = new Thread(w);
t1.start();
t2.start();
}
}
答案 0 :(得分:5)
您正在调用wait并通过实例方法(public synchronized void run()
)进行通知,根据定义,该方法不是静态的。
main
方法中调用等待,这是静态的,您将收到预期的错误。public static synchronized void run()
,但您也会遇到另一个编译错误,即您不再实现Runnable。答案 1 :(得分:0)
编译器何时给出必须从静态上下文调用wait的错误
错误消息是不得从静态上下文调用该方法。如果您尝试在没有实例的static
方法中使用它,则会出现此错误。