Ich habe einen Thread, der bei der Ausführung ein Message-Objekt erstellt, das in eine verknüpfte Liste in einem Monitor eingefügt wird. Zur gleichen Zeit warten zwei andere Threads darauf, dass diese Liste innerhalb kurzer Zeit ein Message-Objekt erhält (linkedlist.isEmpty()) canGetMessage.await(); Schleife, aber ich sende eine canGetMessage.signalAll(); Wenn Sie das Objekt in die Liste einfügen, werden die beiden anderen Threads nie aktiviert.Thread-Bedingung wacht nie auf
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();
}
Ich habe println, um zu sehen, wenn er aus der while-Schleife wird, aber dies nie passiert, und ich weiß nicht, warum ...
Edit: Nur um zu spezifizieren, die Sperre I‘ m Verwendung ist ein ReentrantLock
Warum Sie nicht Verwenden Sie BlockingQueue mit Producer-Consumer-Muster? –
Geben Sie ein vollständiges minimales Beispiel ein, das das Problem reproduziert. –
Welche Typen sind 'lock',' linkedlist' und 'canGetMessage', wie werden sie erstellt? Und, ja, [MCVE] (http://stackoverflow.com/help/mcve) wäre sehr nützlich. – yeputons