2017-04-14 73 views
-1

線程A阻塞的線程能夠喚醒自己嗎?

synchronized void methodA() throws Exception { 
    wait(); 
} 

synchronized void methodB() { 
    notify(): 
} 

線程B

//... work 
A.methodB(); // thread A was so far blocked by calling wait() 

在一個場景中這樣,可以在線程被阻塞喚醒自己?

+0

可能只是我,但我並不完全明白這個問題。你可以發佈[mcve]嗎? – CollinD

+1

如果線程A正在休眠並且線程B將線程A喚醒,那麼您不清楚爲什麼要問線程是否可以自行喚醒它。順便說一句,答案是否定的。 – alfasin

+1

@CollinD - 問題是沒有MCVE是可能的這個問題。 OP(表面上)試圖做的事情不能用Java或任何其他命令式編程語言來表達。 (我毫不猶豫地說根本沒有PL,因爲他們可以想象成是一個計算模型,這是可能的......並且該模型可以想象成是可實現的,例如在量子處理器上。) –

回答

4

阻塞的線程能喚醒自己嗎?

沒有。

wait()(或任何其他阻止調用)中被阻止的線程在解除阻止之前不能執行任何代碼。

做了什麼......包括致電notify() ......要求線程已被解除封鎖。


如果你的設計需要這個,它是無法實現的。這裏有幾個想法......雖然你的問題也不完全一樣。

  1. 而不是wait()使用定時等待;例如wait(millis)。這將等待一個通知(從另一個線程!)或直到millis毫秒已經過去......無論哪個先發生。

  2. 使用第二個線程notify()第一個。