Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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/6/multithreading/4.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_Synchronized - Fatal编程技术网

Java 两类同步

Java 两类同步,java,multithreading,synchronized,Java,Multithreading,Synchronized,我有4个类:主类、生产者类、消费者类和缓冲区类。buffer类包含循环数组的实现(假设它可以工作)。生产者类添加到缓冲区数组,消费者类从缓冲区数组中删除。主类为生产者和消费者创建线程 在producer类中,如果缓冲区未满,则会添加到缓冲区中。如果已满,它将等待使用者从阵列中删除某些内容 在Consumer类中,如果缓冲区不是空的,它将从中删除一个项。如果为空,则等待生产者向缓冲区添加内容 我遇到的问题是,producer将向数组中添加项,但每次它通知消费者它已添加到缓冲区时,消费者都会保持等待

我有4个类:主类、生产者类、消费者类和缓冲区类。buffer类包含循环数组的实现(假设它可以工作)。生产者类添加到缓冲区数组,消费者类从缓冲区数组中删除。主类为生产者和消费者创建线程

在producer类中,如果缓冲区未满,则会添加到缓冲区中。如果已满,它将等待使用者从阵列中删除某些内容

在Consumer类中,如果缓冲区不是空的,它将从中删除一个项。如果为空,则等待生产者向缓冲区添加内容

我遇到的问题是,producer将向数组中添加项,但每次它通知消费者它已添加到缓冲区时,消费者都会保持等待状态。它永远不会继续执行代码的其余部分

// Main.java
Buffer buffer = new Buffer(5); // creates a circular array of length 5.

// 10 is total number of items to be added
Producer p = new Producer(buffer, 10); // uses random number generator for values 
Consumer c = new Consumer(buffer, 10);

p.start();
c.start();

p.join();
c.join();
在producer中,有一个print语句,它打印添加到缓冲区中的5个值(缓冲区的最大大小),但之后什么也不会发生。生产者将值添加到数组中,然后进入等待状态,但消费者不做任何事情,因为它仍然处于等待状态


我不明白为什么消费者不继续,尽管生产者每次向缓冲区添加内容时都会执行notify。

在您的代码中
已同步(这)
是毫无意义的,因为
消费者
生产者
都是独立的对象。这些对象中的每一个都有自己的
监视器,其他对象无法访问该监视器。当(buffer.isEmpty())wait()时,您卡在
上的
消费者
因为
Producer
中没有调用
cosumer.notify()

它很可能是
synchronized(buffer)
(后面是
buffer.wait()
buffer.notify()
),因为它是表示代码中共享状态的
buffer
对象


您正在使用
缓冲区重新实现。为什么不使用JDK中已有的类?

Thx。成功了!花了这么多时间想弄明白。
public class Producer extends Thread {

    ...

    public void run() { 
        ...
        while(true) {
            synchronized(this) {
                try {
                    while(buffer.isFull()) wait(); 
                    ...
                    buffer.insert(val);
                    notify();
                    ... // other stuff that eventually breaks the loop
                } catch(InterruptedException e) {}
            }
        }
    }
}
public class Consumer extends Thread {

    ...

    public void run() {
        while(true) {
            synchronized(this) {
                try {
                    while(buffer.isEmpty()) wait(); // its stuck here
                    ...
                    buffer.remove();
                    notify();
                    ... // other stuff that eventually breaks the loop
                } catch (InterruptedException e) {}
            }
        }
    }
}

// Inside Buffer.java

public void insert(int n) {
    ...
    buffer[front] = n;
    front++;
    size++;
}

public int remove() {
    ...
    temp = buffer[rear] = -1;
    rear--;
    size--;
    return temp;
}