请看以下代码:public class TestThread {
public static Object obj = new Object();
public static int i = 0;
public static void main(String[] args) {
Runnable r1 = new Runner1();
Thread t1 = new Thread(r1);
t1.start();
try {
Thread.sleep(1);
} catch(InterruptedException ie) {} synchronized(TestThread.obj) {
TestThread.i++;
try {
Thread.sleep(1);
} catch(InterruptedException ie) {}
System.out.println(Thread.currentThread() + "@ i = " + TestThread.i);
}
}
}class Runner1 implements Runnable {
public Object oo = new Object();
public void run() {
// 这里出错了! 不能为 TestThread.obj!
// 换成 this 就正确, 为什么呢?
synchronized(TestThread.obj) {
TestThread.i++;
try {
this.wait();
} catch(InterruptedException ie) {}
System.out.println(Thread.currentThread() + "@ i = " + TestThread.i);
}
}
}以上代码出现的错误提示信息为:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
Thread[main,5,main]@ i = 3
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Runner1.run(TestThread.java:33)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Runner1.run(TestThread.java:33)
at java.lang.Thread.run(Unknown Source)这个错误的原因是 synchronized(TestThread.obj) 为什么用了wait()方法的 synchronized 里的锁不能为 TestThread.obj 呢?
请高手详细解释, 谢谢!
public static Object obj = new Object();
public static int i = 0;
public static void main(String[] args) {
Runnable r1 = new Runner1();
Thread t1 = new Thread(r1);
t1.start();
try {
Thread.sleep(1);
} catch(InterruptedException ie) {} synchronized(TestThread.obj) {
TestThread.i++;
try {
Thread.sleep(1);
} catch(InterruptedException ie) {}
System.out.println(Thread.currentThread() + "@ i = " + TestThread.i);
}
}
}class Runner1 implements Runnable {
public Object oo = new Object();
public void run() {
// 这里出错了! 不能为 TestThread.obj!
// 换成 this 就正确, 为什么呢?
synchronized(TestThread.obj) {
TestThread.i++;
try {
this.wait();
} catch(InterruptedException ie) {}
System.out.println(Thread.currentThread() + "@ i = " + TestThread.i);
}
}
}以上代码出现的错误提示信息为:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
Thread[main,5,main]@ i = 3
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Runner1.run(TestThread.java:33)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Runner1.run(TestThread.java:33)
at java.lang.Thread.run(Unknown Source)这个错误的原因是 synchronized(TestThread.obj) 为什么用了wait()方法的 synchronized 里的锁不能为 TestThread.obj 呢?
请高手详细解释, 谢谢!
解决方案 »
- 第一次碰到这种问题!求围观。
- 一个印度老师给的作业,大家看看JAVA怎么搞
- 急!!! 这几天正在做一个项目,其中有一个要求是读取服务器上的一个文本文件,不知道该怎么做,请大家给指点一下
- =========做一个服务器和客户端,但是怎么传image呢?=========
- 100分在线求救~~如何给二维数组赋值?
- applet中,可以有多个CLASS吗?其中一个是继承于APPLET,其他的被他所使用.在HTML中应该怎么写?是不是所有的CLASS都要写上去?
- 简单的问题,帮帮忙啦!
- weblogic 使用 .war 的问题:
- 网上一小段代码不会用,求帮忙~
- java 的一个很难的问题,欢迎高手来解答
- 关于贪吃蛇游戏的疑问
- 小鸟请教老鸟
TestThread.obj.wait();
因为调用wait必须拥有该对象的监视锁,你现在得到了TestThread.obj的锁,就要调用TestThread.obj的wait