[英]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
是非常不尋常的,可能不是您想要的。
我不確定您要做什么,但是您會混淆wait
和sleep
嗎?
如果你想等待另一個線程完成,那就是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.