生产者/消费者使用等待和通知

时间:2012-11-23 17:04:21

标签: java multithreading producer-consumer

我正在尝试协调生产者和消费者线程问题。生产者在队列中放置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;


}

1 个答案:

答案 0 :(得分:3)

生产者永远不会通知消费者线程。因此,如果消费者是第一个启动的,它会发现队列为空,并且永远等待。

我只想使用BlockingQueue,它可以帮到你。

如果您真的想使用wait()notify(),则需要:

  • 在你的wait()电话周围使用一个循环,如果要唤醒的条件不正确,则返回等待状态
  • 决定生产者何时应该通知(通常,当它将一个项目放入队列时)
  • 决定消费者何时应该通知(通常,当它从队列中删除项目时)
  • 决定消费者何时应该等待(通常,当队列为空时)
  • 决定生产者何时应该等待(通常,当队列已满)
  • 停止忽略InterruptedException。让它们传播。

我会使用notifyAll(),如果有多个生产者或消费者,这也会确保一切正常。