Java 生产者/消费者使用等待和通知
我试图协调生产者和消费者的线程问题。生产者将10个对象放入队列。也就是说,producer的run方法只包含一个简单的循环来添加10个对象,然后就完成了。当队列已满(队列大小为10)时,会在队列的add方法中调用wait()->。在消费者方面,消费者开始偷看对象,然后开始移除它们。我遇到的问题是,在大约50%的情况下,当程序运行时,在生产者将10个对象放入队列后,输出终止。另外50%的情况下,程序运行正常-即消费者取下所有对象。我以前解决这个问题的方法是在producer的run方法中创建一个新的使用者线程。所以,一旦生产者将十个对象放入队列,就创建了新的使用者线程,我使用join()来同步操作。然而,我想让这个过程与等待和通知一起工作。有人能告诉我我做错了什么吗?谢谢Java 生产者/消费者使用等待和通知,java,multithreading,producer-consumer,Java,Multithreading,Producer Consumer,我试图协调生产者和消费者的线程问题。生产者将10个对象放入队列。也就是说,producer的run方法只包含一个简单的循环来添加10个对象,然后就完成了。当队列已满(队列大小为10)时,会在队列的add方法中调用wait()->。在消费者方面,消费者开始偷看对象,然后开始移除它们。我遇到的问题是,在大约50%的情况下,当程序运行时,在生产者将10个对象放入队列后,输出终止。另外50%的情况下,程序运行正常-即消费者取下所有对象。我以前解决这个问题的方法是在producer的run方法中创建一个新
@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;
}
生产者从不通知消费者线程。因此,如果消费者是第一个启动的,它会发现队列是空的,并一直等待 我会简单地使用一个BlockingQueue,它可以为您实现这一点 如果确实要使用
wait()
和notify()
,则需要:
- 在
调用周围使用循环,如果要唤醒的条件不正确,则返回等待状态wait()
- 决定制作人何时通知(通常,当它将项目放入队列时)
- 决定消费者何时应该通知(通常,当消费者从队列中删除项目时)
- 决定消费者应该等待的时间(通常,当队列为空时)
- 决定生产者应等待的时间(通常,当队列已满时)
- 停止忽略中断异常。就让它们繁殖吧
我会使用
notifyAll()
,如果有多个生产者或消费者,这也会确保一切正常。谢谢你的提示。我会考虑这些建议,以供日后参考。这次我的问题更为琐碎——线程没有正确地“启动和连接”。再次感谢你的提示。