我正在尝试协调生产者和消费者线程问题。生产者在队列中放置10个对象。那就是生产者的run方法只包含一个简单的循环来添加10个对象然后就完成了。当队列已满(队列大小为10)时,会调用wait() - >在队列的add方法中。在消费者方面,消费者首先窥视对象,然后开始删除它们。我遇到的问题是,在程序运行的大约50%的情况下,输出在生产者将10个对象放入队列后终止。程序正常工作的另外50% - 即消费者取消所有对象。我之前解决这个问题的方法是在生产者的run方法中创建一个新的消费者线程。因此,一旦生产者将十个对象放在队列中,就会创建新的消费者线程,并使用join()来同步操作。但是我想让这个过程与wait和notify一起工作。有人可以告诉我我做错了什么吗?感谢
@Override
public synchronized boolean add(Process element) {
if(isFull())
{
waitForNotify();
}
else
{
queue.add(element);
}
return true;
}
private void invokeNotify() {
try {
notify();
} catch (Exception e) {
e.printStackTrace();
}
}
private void waitForNotify() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public synchronized boolean offer(Process element) throws IllegalStateException {
queue.add(element);
this.queue = newHeapSort.heapify(queue, queue.size());
return true;
}
@Override
public synchronized Process peek() {
if(queue.isEmpty())
{
waitForNotify();
}
return(queue.get(0));
}
@Override
public synchronized Process head() {
if(queue.isEmpty())
{
invokeNotify();
}
Process head = queue.get(0);
queue.remove(0);
return head;
}
答案 0 :(得分:3)
生产者永远不会通知消费者线程。因此,如果消费者是第一个启动的,它会发现队列为空,并且永远等待。
我只想使用BlockingQueue,它可以帮到你。
如果您真的想使用wait()
和notify()
,则需要:
wait()
电话周围使用一个循环,如果要唤醒的条件不正确,则返回等待状态我会使用notifyAll()
,如果有多个生产者或消费者,这也会确保一切正常。