2013-01-17 2 views
0

wait() 및 notify()는 정적이 아니므로 컴파일러는 정적 컨텍스트에서 wait를 호출해야한다는 오류를 제공해야합니다.wait 및 notify는 정적이 아닙니다.

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

당신의 혼란이 어디인지는 모르겠지만 정적 메서드에서'new World()'를 만들면'new' 인스턴스가 어떻게 든 정적이되지 않습니다. 인스턴스는 인스턴스입니다. 또한'World' 클래스에 정적 메소드를 추가한다고해서 그 클래스의 다른 메소드가 정적 인 것은 아닙니다. – hyde

답변

5

은 기다려야를 호출 정의상 정적 아니다 인스턴스 메소드 (public synchronized void run())로부터 통지된다.

  • 정적 인 main 메서드 내에서 대기 호출하면 예상 한 오류가 발생합니다.
  • 또는 메소드 서명을 public static synchronized void run()으로 변경할 수 있지만 더 이상 Runnable을 구현하지 않는 또 다른 컴파일 오류가 발생합니다.
+0

죄송합니다, 저의 실수입니다. – amrita

+1

방금 ​​추가 할 ...이 메서드는 Object 클래스의 메서드이며 직접 호출 할 때 현재 개체를 잠 그거나 잠금 해제합니다. this.wait() 등을 생각할 수 있습니다. 두 번째 경우에는 World 개체가 잠기거나 잠금 해제됩니다. – Amit

0

컴파일러가 정적 텍스

오류 메시지가 방법은 정적 컨텍스트에서 호출 할 수 없습니다해야한다는 것입니다 호출해야 기다립니다 오류를 줄 않을 때. 인스턴스없이 static 메소드에서이 값을 사용하려고하면이 오류가 발생합니다.