簡體   English   中英

為什么我的代碼拋出IllegalMonitorStateException?

[英]Why is my code throwing an IllegalMonitorStateException?

我試圖了解線程如何在Java中工作。 因此,我寫了一小段代碼,在該代碼中,我創建了兩個線程,一個線程打印所有奇數,其他線程打印偶數,並嘗試在它們之間進行同步,以便按順序打印所有數字。

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線程t1t2 擁有鎖的線程可以使用動作notifynotifyAllwait 在這種情況下, main線程擁有的鎖不是t1t2

您將需要在每個線程的run方法內進行同步才能wait


這是我在run方法中進行synchronizing意思的示例。

啟動線程后, run方法中發生的任何操作都將由該線程運行來完成。 因此,當您嘗試wait您將要確保線程擁有鎖,可以通過在run方法中對其進行同步來做到這一點。

public void run() {
     synchronized(lock){
         while(true){
            if (n != 1){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
               }
            }
            n = n + 2;
            System.out.println(n);
            lock.notify();
        }
    }
}

如您所見,我正在run方法中進行同步,以便t1t2在通知或等待時擁有鎖。

這可能不會幫助您了解底層的線程機制,但是對於您而言,將CyclicBarrierCyclicBarrier一起使用是有意義的。

在處理n = n + 2 ,使兩個踏步都在障礙上等待,讓barrierAction sysout重復兩個線程的當前n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM