スレッドが実行されると、モニタのリンクリストに入れられるMessageオブジェクトが作成されます。同時に、他の2つのスレッドは、このリストがMessageオブジェクトを取得するのを待ちます。(linkedlist.isEmpty())canGetMessage.await();私はcanGetMessage.signalAll()を送信していますが、コマンドを使用すると、オブジェクトをリストに入れても、他の2つのスレッドは起きることはありません。スレッド条件が起こらない
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();
}
私はそれがwhileループを抜けたときに見にprintlnをしましたが、この問題が発生したことがない、と私はなぜ...
編集知りません:だけを指定する、私は」ロックを使用は再入可能ロックです
はなぜいけませんプロデューサ - コンシューマパターンでBlockingQueueを使用しますか? –
問題を再現する完全な最小例を投稿してください。 –
'lock'、' linkedlist'と 'canGetMessage'はどのような型ですか、どのように作られていますか?そして、はい、[MCVE](http://stackoverflow.com/help/mcve)は非常に便利です。 – yeputons