我的程序有兩個線程,每個線程打印十個數字。第一條線打印奇數,第二條線打印偶數,然後輪流打印數字。我期待得到像1,2,3,4,5 ....直到20的序列,但程序產生IllegalMonitorStateException。有兩個線程的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();
}
}
,這是所產生的異常:
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)
我不知道這一點。有任何想法嗎?
這不會控制誰先運行,只是確保兩個線程在打印第二個數字之前打印第一個數字。 – 2012-03-02 22:56:07