0

wait() 和 notify() 不是静态的,因此编译器应该给出必须从静态上下文调用 wait 的错误。

public class Rolls {
  public static void main(String args[]) {
    synchronized(args) {
        try {
            wait();
        } catch(InterruptedException e)
        { System.out.println(e); }
    }
  }
}

但是以下代码可以正常编译并运行。为什么编译器不在这里给出错误?或者,为什么编译器会在前面的代码中给出等待必须从静态上下文调用的错误?

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();
  }
} 
4

2 回答 2

5

您正在从一个实例方法 ( public synchronized void run()) 调用 wait 和 notify,根据定义,它不是静态的。

  • 如果您在main静态方法中调用 wait ,您将得到您期望的错误。
  • 或者,您可以将方法签名更改为,public static synchronized void run()但您也会收到另一个编译错误,即您不再实现 Runnable。
于 2013-01-17T10:46:38.407 回答
0

编译器何时给出必须从静态上下文调用等待的错误

错误消息是不能从静态上下文中调用该方法。如果您尝试在static没有实例的方法中使用它,您将收到此错误。

于 2013-01-17T10:53:16.370 回答