Wei*_*ing 0 java multithreading
我的程序有两个线程,每个线程打印十个数字。第一个线程打印奇数,第二个线程打印偶数,然后轮流打印数字。我期望得到一个像1,2,3,4,5 ....直到20的序列,但是该程序会产生一个IllegalMonitorStateException。
我知道此异常的含义,但是我在和同步块中使用wait()和notify()。这是我的代码:
public class EvenOddThreadTest {
/**
* @param args
*/
static Object obj1 = new Object();
static Object obj2 = new Object();
static Object obj3=new EvenOddThreadTest();
public static void main(String[] args) throws InterruptedException {
new Thread() {
@Override
public void run() {
for (int i = 1; i < 21; i += 2) {
synchronized (obj1) {
System.out.println(i + Thread.currentThread().getName());
try {
obj2.notify();
obj1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start();
new Thread() {
@Override
public void run() {
for (int i = 2; i < 21; i += 2) {
synchronized (obj2) {
System.out.println(i + Thread.currentThread().getName());
try {
obj1.notify();
obj2.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
}
Run Code Online (Sandbox Code Playgroud)
这是生成的异常:
1Thread-0
2Thread-1
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at EvenOddThreadTest$1.run(EvenOddThreadTest.java:21)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at EvenOddThreadTest$2.run(EvenOddThreadTest.java:41)
Run Code Online (Sandbox Code Playgroud)
我不知道这个。有任何想法吗?
您不能在您不拥有其监视器的对象上调用通知:
synchronized (obj1) {
System.out.println(i + Thread.currentThread().getName());
try {
obj2.notify(); // You haven't synchronized on obj2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9384 次 |
| 最近记录: |