等待和通知不是静态的

时间:2013-01-17 10:45:24

标签: java wait notify

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

2 个答案:

答案 0 :(得分:5)

您正在调用wait并通过实例方法(public synchronized void run())进行通知,根据定义,该方法不是静态的。

  • 如果您在main方法中调用等待,这是静态的,您将收到预期的错误。
  • 或者,您可以将方法签名更改为public static synchronized void run(),但您也会遇到另一个编译错误,即您不再实现Runnable。

答案 1 :(得分:0)

  

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

错误消息是不得从静态上下文调用该方法。如果您尝试在没有实例的static方法中使用它,则会出现此错误。