私のプログラムには2つのスレッドがあり、それぞれ10個の数字が出力されます。最初のスレッドは奇数を出力し、2番目のスレッドは偶数を出力し、番号を順に印刷します。私は1,2,3,4,5 ....のようなシーケンスを20まで得ることを期待していますが、プログラムはIllegalMonitorStateExceptionを生成します。2つのスレッドを持つ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)
。何か案は?
誰が最初に実行するかを制御することはできません。両方のスレッドが2番目の番号を印刷する前に最初の番号を印刷するようにします。 –