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)方法没有加锁,是个不需要加锁就能运行得方法。