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_Concurrency_Producer Consumer_Producer - Fatal编程技术网

Java线程生产者消费者算法工作不正常

Java线程生产者消费者算法工作不正常,java,multithreading,concurrency,producer-consumer,producer,Java,Multithreading,Concurrency,Producer Consumer,Producer,我试图学习线程,因此我编写了一个示例生产者-消费者问题,其中生产者产生1到10的数字,消费者必须显示它们。但只有消费者显示数字1并停止 正如我所说,这个程序写得不好,可能很荒谬,但我仍然想找出为什么从1到10的所有数字都没有打印出来的原因,因为我在编写代码时会记得最好,而不是从示例中 我使用两个varibales跟踪产品或消费者活动的完成情况,以便执行另一个 /getStatus(消费者C) 传递消费者参考,以便生产者向消费者提供参考。。它还可以用来了解消费者的状况,就是这样/ 在…的输入之后。

我试图学习线程,因此我编写了一个示例生产者-消费者问题,其中生产者产生1到10的数字,消费者必须显示它们。但只有消费者显示数字1并停止

正如我所说,这个程序写得不好,可能很荒谬,但我仍然想找出为什么从1到10的所有数字都没有打印出来的原因,因为我在编写代码时会记得最好,而不是从示例中

我使用两个varibales跟踪产品或消费者活动的完成情况,以便执行另一个

/getStatus(消费者C) 传递消费者参考,以便生产者向消费者提供参考。。它还可以用来了解消费者的状况,就是这样/

在…的输入之后。。苏拉吉。。现在程序运行良好。。见下文

导入java.lang.Math; 公共课你好{

public static void main(String args[]) {

    System.out.println("---1");
    new Consumer().start();

}

}

class Producer extends Thread{

public int produce = 0;
public Consumer consumerObj =null;
int count = 1;
boolean producerStatus = false;

public void run(){

    System.out.println("---4");

        do{
            if(consumerObj.getStatus()){


            System.out.println("---6");
            produce = produce+1;
            System.out.println("---9 -- >produce is -->"+produce);
            producerStatus = true;
            synchronized(this){

            notify();
            System.out.println("---6.111");
            }

            consumerObj.consumerStatus = false;
            count = count+1;


            }


        }while(count<=10);


}

public int getItem(){

    return produce;

}

public boolean getStatus(Consumer c){

    consumerObj = c;
    return producerStatus;

}

}



class Consumer extends Thread{

boolean consumerStatus = true;
int count =1;
public void run(){

    System.out.println("---2");
    Producer p = new Producer();
    p.getStatus(this);
    p.start();//can a thread1 wait on an thread2 before the thread2 hass tarted and in this case wll notify on the scnd thread reaally notify therad1 ..
    try{
        System.out.println("---3");
        synchronized(p){
            System.out.println("---5");
            p.wait();

            System.out.println("---8");
        }
    }
    catch(Exception e){
            System.out.println("exception");
    }


        try{
            while(count<=10 ){

                System.out.println("---7");
                int consume = p.getItem();
                System.out.println("the produced item is ----->"+consume);
                count = count+1;
                p.producerStatus  = false;
                consumerStatus = true;
                synchronized(p){
                p.wait();   
                System.out.println("---10");        
                }


            }
        }
        catch(Exception e){
            System.out.println("exception");
        }


}

public boolean getStatus(){

    return consumerStatus;

}

}
publicstaticvoidmain(字符串参数[]){
System.out.println(“--1”);
新消费者().start();
}
}
类生成器扩展线程{
公共int=0;
公共消费者robj=null;
整数计数=1;
布尔producerStatus=false;
公开募捐{
System.out.println(“--4”);
做{
if(consumerObj.getStatus()){
System.out.println(“--6”);
生产=生产+1;
System.out.println(“--9-->product为-->”+product);
producerStatus=真;
已同步(此){
通知();
System.out.println(“--6.111”);
}
consumerrobj.consumerStatus=false;
计数=计数+1;
}
}当(count在Producer中时,您可以设置

consumerObj.consumerStatus = false;
并立即在循环条件下检查该值。循环在1个循环后结束。 之后

你应该等待(等待“消费”)

消费者也有同样的问题。循环中的最后一件事应该是

p.wait();
嗯。 程序是错误的

  • 使用者线程出现并等待锁定
  • producer循环中的第一次迭代将调用notify,但doessent会释放锁,因为while循环在同步块内。它将在不释放锁的情况下进行10次迭代,并最终连续调用notify 10次
  • 但是消费者只需要唤醒一次,第二次调用wait()时,消费者会继续等待,因为现在没有人可以调用notify(因为生产者的所有10次迭代都结束了)

  • 所以问题是消费者线程正在等待,但没有人通知它,因为制作人在一次拍摄中完成了所有10次迭代。您应该使用BlockingQueues。 看

    上面的实现是无效的,它迫使所有的消费者进行阻止。 使用多个队列,您可以防止所有使用者阻塞。
    你可以在google.Java.util.concurrent上找到例子使用它,这是有原因的。

    当你只有一个线程在othr上等待时,我不认为这有什么区别。。stll尝试了它的工作。。是的,sry。快速查看后写下答案。给我几分钟。当你说这个的时候。等等()在producer中,您正在等待同一个线程,这怎么会发生?这是指producer并调用this.wait()在同一个类中?因为我在producer中将consumerStatus设置为false之后,consumer应该在它执行后将其更改为true,这样现在producer就可以执行了…这是为了确保重复的producer执行不会发生..stll它不起作用..你的解释是结构化的,但我有几个DBT..你的意思是在每次不执行p之后roducer shud放弃锁为什么如此..?为了使代码正常工作,我将while循环带到同步块之外。我的另一个疑问是生产者的执行取决于消费者的状态..因为我在消费者中设置了一个标志,根据该标志执行..thn没有消费者执行,生产者如何交替执行继续。。
    consumerObj.consumerStatus = false;
    
    count = count+1;
    
    try{
        this.wait();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    p.wait();