wait()與sleep()的區別相信很多人都懂了,在這里我就不說了。
wait(),對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
public class ThreadTest {
static int i=0;
public static void main(String[] args) {
new ThreadTest().setInt(5);
System.out.println(i);
}
public void setInt(int i){
this.i=i;
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
因此在對上述概念較充分理解后,你就會明白以上這個程序錯在哪里?
在eclipse編寫和編譯并沒有錯,但當運行后eclipse提示:IllegalMonitorStateException: current thread not owner
Exception in thread "main" java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Unknown Source)
at standlww.project.ThreadTest.setInt(ThreadTest.java:21)
at standlww.project.ThreadTest.main(ThreadTest.java:12)Exception in thread "main" java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Unknown Source)
at standlww.project.ThreadTest.setInt(ThreadTest.java:21)
at standlww.project.ThreadTest.main(ThreadTest.java:12)
原因在于對此對象調用wait方法導致本線程放棄對象鎖對此對象調用wait方法導致本線程放棄對象鎖,而 public void setInt(int i)方法沒有加鎖,是個不需要加鎖就能運行得方法。