我有一個線程,當它運行時,它創建一個Message對象,放入監視器的鏈表中。與此同時,另外兩個線程等待這個列表獲取一個Message對象,在一段時間(linkedlist.isEmpty())canGetMessage.await();循環,但即使我發送canGetMessage.signalAll();命令將對象放入列表中時,其他兩個線程都不會喚醒。線程條件不會醒來
public void deliverMessage(Message m){
lock.lock();
try{
linkedlist.add(m);
canGetMessage.signalAll();
}finally{
lock.unlock();
}
}
public Message getMessage(){
lock.lock();
try{
while(linkedlist.isEmpty()){
canGetMessage.await();
}
return linkedlist.remove(); //returns the item that has been in the list the longest
}
catch (InterruptedException e) { } //not required to handle these
finally{
lock.unlock();
}
我已經調用println看到它的時候失控while循環,但是這永遠不會發生,我不知道爲什麼...
編輯:只是爲了說明,鎖我m使用的是ReentrantLock
你爲什麼不使用生產者 - 消費者模式的BlockingQueue? –
發佈一個完整的重現問題的最小示例。 –
'lock','linkedlist'和'canGetMessage'是什麼類型的,它們是如何創建的?而且,是的,[MCVE](http://stackoverflow.com/help/mcve)將會非常有用。 – yeputons