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); }
}
}
}
但是,以下代碼編譯並正常運行。爲什麼編譯器不在這裏給出錯誤?或者,爲什麼編譯器在前面的代碼中給出了必須從靜態上下文中調用等待的錯誤?
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();
}
}
不知道你的困惑在哪裏,但是在靜態方法中創建'new World()'不會使'new'ed實例靜態,實例就是一個實例。同時向你的'World'類添加一個靜態方法並不會使該類的其他方法以某種方式靜態。 – hyde