簡體   English   中英

wait() 和 notify() 方法,總是發生 IllegalMonitorStateException 並告訴我當前線程不是所有者為什么?

[英]wait() and notify() method , always IllegalMonitorStateException is happen and tell me current Thread is not Owner Why?

package pkg_1;

public class ExpOnWaitMethod extends Thread {

    static Double x = new Double(20);


    public static void main(String[] args) {

        ExpOnWaitMethod T1 = new ExpOnWaitMethod();
        ExpOnWaitMethod T2 = new ExpOnWaitMethod();

        T1.start();

        T2.start();

    }

    public void run() {

        Mag mag = new Mag();

        synchronized (x) {

            try {
                for (int i = 1; i < 10; i++) {
                    mag.nop(Thread.currentThread());
                    x = i * 2.0;

                }

            } catch (InterruptedException e) {

                e.printStackTrace();
            }

        }
    }

}

class Mag {
    char ccc = 'A';

    public void nop(Thread thr) throws InterruptedException {

        System.out.print(ccc + " ");
        ccc++;

        if (thr.getState().toString().equalsIgnoreCase("runnable"))
            Thread.currentThread().wait();
        //thr.notify();
    }
}

您需要鎖定您想要wait的對象(您只能在synchronized塊中調用它)。

此外,在Thread上調用wait是非常不尋常的,可能不是您想要的。

我不確定您要做什么,但是您會混淆waitsleep嗎?

如果你想等待另一個線程完成,那就是anotherThread.join()

在對對象調用wait之前,您必須獲取該對象的鎖:

synchronized(obj)
{
    obj.wait();
}

您的代碼在沒有先獲取鎖的情況下調用Thread對象的wait

我認為這只是一個簡化的測試用例來顯示您的問題,但請注意,您可能希望在一個可從所有線程訪問的對象上調用wait ,而不是在Thread對象本身上調用。

有人應該引用java.lang.Object.wait()的 API 契約,它直接解釋了這一點。 如果方法引發異常,請閱讀文檔。

如有疑問,請閱讀合同。 (NewsRadio 上的 Bill McNeal 總是把他的口袋放在夾克口袋里,這是 JavaDoc API 的一個很好的比喻。請參閱NewsRadio下的“Crazy Prepared”並思考不可估量的事情。)

暫無
暫無

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

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