我想了解線程如何在Java中工作。因此,我寫了一小段代碼,我創建了兩個線程,一個打印所有奇數和其他打印偶數,並嘗試在它們之間進行同步,以便所有數字都按順序打印。爲什麼我的代碼拋出IllegalMonitorStateException?
public class Main
{
public static void main (String args[]){
Main lock = new Main();
Test t1 = new Test(1, lock);
Test t2 = new Test(2, lock);
synchronized(lock){
(new Thread(t1)).start();
(new Thread(t2)).start();
}
}
}
public class Test implements Runnable {
int n;
Main lock;
public Test(int newN, Main lockObj){
this.n = newN;
this.lock = lockObj;
}
public void run() {
while(true){
if (n != 1){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
n = n + 2;
System.out.println(n);
lock.notify();
}
}
}
可有人請幫助理解潛在的問題是什麼?
將'Main'的實例用作鎖對象有點奇怪。它沒有傷害,但更傳統的說'對象鎖定=新對象()'。當你開始與其他開發人員合作時,更傳統就變得很重要。如果你的代碼看起來不奇怪,他們會更樂意與你一起工作。 – 2015-02-10 18:13:17
重要的是要注意,wait()必須始終在嚴格循環內調用,以檢查正在等待的條件。該方法的[文檔](http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--)具有完整的詳細信息和示例。 – VGR 2015-02-10 19:25:24