Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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_Condition Variable - Fatal编程技术网

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

显式锁和条件变量Java生产者消费者,java,multithreading,condition-variable,Java,Multithreading,Condition Variable,我试图运行一个生产者-消费者示例,我从中获得,代码如下。当我运行它的时候,它只运行了两次,而且好像挂着。代码似乎是解锁和信号正确,有人知道我错过了什么 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=

我试图运行一个生产者-消费者示例,我从中获得,代码如下。当我运行它的时候,它只运行了两次,而且好像挂着。代码似乎是解锁和信号正确,有人知道我错过了什么

    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;
    }
}
静态线程t1;
静态螺纹t2;
公共静态void main(字符串[]args){
Lab2 r1=新的Lab2();
Lab2 r2=新的Lab2();
t1=新螺纹(r1,“生产商”);
t2=新螺纹(r2,“耗电元件”);
//系统输出打印项次(“添加”);
t1.start();
t2.start();
}
公共int get(int who){
aLock.lock();
系统输出打印项次(“锁定1”);
试一试{
while(可用==false){
试一试{
System.out.println(“假有效等待”);
condVar.await();
System.out.println(“假有效等待完成”);
}捕获(中断异常e){}
}
可用=错误;
System.out.println(“消费者”+who+“获得”:+
内容);
condVar.signalAll();
}最后{
aLock.unlock();
返回内容;
}
}
公共作废认沽权(int who,int value){
aLock.lock();
系统输出打印项次(“锁定”);
试一试{
while(可用==true){
System.out.println(“真实有效”);
试一试{
condVar.await();
}捕获(中断异常e){}
}
内容=价值;
可用=真实;
System.out.println(“制作人”+who+”put:+contents);
condVar.signalAll();
//condVar.signal();
}最后{
aLock.unlock();
}
}
公开募捐{
//System.out.println(Thread.currentThread().getName()+“线程已启动”);
int i=0;
//系统输出打印项次(“添加”);
而(i你的问题就在这里:

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

t1=new Thread(r1, "producer");
t2= new Thread(r2, "consumer");
也就是说,您有两个线程执行独立的runnable(r1、r2),但它们应该具有相同的runnable

替换为:

Lab2 r=new Lab2();

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

你在运行什么代码?你发布了两个方法,但我们不知道你如何使用它们。亚罗斯拉夫,谢谢。我添加了它。谢谢!你至少为我节省了一个小时。