Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生产者/消费者使用等待和通知_Java_Multithreading_Producer Consumer - Fatal编程技术网

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

Java 生产者/消费者使用等待和通知,java,multithreading,producer-consumer,Java,Multithreading,Producer Consumer,我试图协调生产者和消费者的线程问题。生产者将10个对象放入队列。也就是说,producer的run方法只包含一个简单的循环来添加10个对象,然后就完成了。当队列已满(队列大小为10)时,会在队列的add方法中调用wait()->。在消费者方面,消费者开始偷看对象,然后开始移除它们。我遇到的问题是,在大约50%的情况下,当程序运行时,在生产者将10个对象放入队列后,输出终止。另外50%的情况下,程序运行正常-即消费者取下所有对象。我以前解决这个问题的方法是在producer的run方法中创建一个新

我试图协调生产者和消费者的线程问题。生产者将10个对象放入队列。也就是说,producer的run方法只包含一个简单的循环来添加10个对象,然后就完成了。当队列已满(队列大小为10)时,会在队列的add方法中调用wait()->。在消费者方面,消费者开始偷看对象,然后开始移除它们。我遇到的问题是,在大约50%的情况下,当程序运行时,在生产者将10个对象放入队列后,输出终止。另外50%的情况下,程序运行正常-即消费者取下所有对象。我以前解决这个问题的方法是在producer的run方法中创建一个新的使用者线程。所以,一旦生产者将十个对象放入队列,就创建了新的使用者线程,我使用join()来同步操作。然而,我想让这个过程与等待和通知一起工作。有人能告诉我我做错了什么吗?谢谢

    @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()
,如果有多个生产者或消费者,这也会确保一切正常。

谢谢你的提示。我会考虑这些建议,以供日后参考。这次我的问题更为琐碎——线程没有正确地“启动和连接”。再次感谢你的提示。