显式锁和条件变量 Java 生产者消费者

Explicit Locks and Condition Variables Java Producer Consumer

我正在尝试 运行 我从 http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.html 获得的生产者消费者示例,代码如下。当我 运行 它时,它只是 运行 两次并且似乎挂起。密码似乎可以正确解锁和发出信号,有谁知道我错过了什么。

    static Thread t1;
static Thread t2;


public static void main(String[] args){
    Lab2 r1=new Lab2();
    Lab2 r2=new Lab2();


    t1=new Thread(r1, "producer");
    t2= new Thread(r2, "consumer");
    //System.out.println("Adding");

    t1.start();
    t2.start();

}



public int get(int who) {

    aLock.lock();
    System.out.println("locked1");

    try {
        while (available == false) {

            try {
                System.out.println("false avail waiting");

                condVar.await();
                System.out.println("false avail waiting done");

            } catch (InterruptedException e) { }
        }
        available = false;
        System.out.println("Consumer " + who + " got: " +
                            contents);
        condVar.signalAll();
    } finally {
        aLock.unlock();
        return contents;
    }
}

public void put(int who, int value) {


                aLock.lock();
                System.out.println("locked");

try {
    while (available == true) {
        System.out.println("true avail");
        try {
            condVar.await();
        } catch (InterruptedException e) { }
    }
    contents = value;
    available = true;
    System.out.println("Producer " + who + " put: " +contents);
    condVar.signalAll();
    //condVar.signal();
    } finally {
        aLock.unlock();

    }
}


public void run() {
    //System.out.println(Thread.currentThread().getName()+" Thread started");
    int i=0;
    //System.out.println("Adding");

    while(i<10){
        i++;
        //System.out.println(i);
        if (Thread.currentThread().getName().equals("producer")){
        get(2);
        //producer();
        }
        else{
        put(2,1);
        //consumer();
        }
        //break;
    }
}

您的问题在这里:

Lab2 r1=new Lab2();
Lab2 r2=new Lab2();

t1=new Thread(r1, "producer");
t2= new Thread(r2, "consumer");

即你有两个线程执行独立的 runnables (r1, r2) 但它们应该提供相同的 runnable。

替换为:

Lab2 r=new Lab2();

t1=new Thread(r, "producer");
t2= new Thread(r, "consumer");