在我的應用程序中的某個時刻,我想讓我的主線程(即當前正在執行的線程)休眠一段時間或直到背景完成(和喚醒它),以先到者爲準。當前線程在等待另一個線程時睡眠
這裏是我做的(我想會的工作,但沒有)
public static void main(String args[])
{
// .... other stuff ...
// show a splash screen
// just think of this as an image
showPlashScreen():
new Thread(new Runnable()
{
public void run()
{
// do some work here
// notify everyone after the work is done
Thread.currentThread().notifyAll();
}
}).start();
// now make the current thread to wait for the background
// or for at most 1000
Thread.currentThread().wait(1000);
disposeSplashScreen();
// ... other stuff ....
}
執行此,我不斷收到java.lang.IllegalMonitorStateException
(部分)堆棧跟蹤:
Caused by: java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
.... <cut> ....
Exception in thread "Thread-7" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
這適用於我!但你會介意解釋它是如何工作的嗎?所以在第一個同步塊中,當執行'someObject.wait()'時,當前線程會進入休眠狀態(什麼也不做),對吧?這意味着同步塊尚未完成執行。結果,'someObject'將被當前線程(永遠)激活!第二個同步塊如何獲得'someObject',以便它可以調用'notify'? (我很確定我上面有什麼問題,請你指出一下嗎?謝謝!) – 2013-05-01 07:30:48
這很簡單。只要monitor('someObject')所有者線程到達wait方法,它就停止成爲所有者,鎖釋放,線程開始休眠,直到調用notify方法。 – SeniorJD 2013-05-01 07:43:46