Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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,作为练习,我编写了以下代码来实践生产者/消费者模式: public class Producer implements Runnable { BlockingQueue<Entity> entities; public Producer(BlockingQueue<Entity> entities) { this.entities = entities; } @Override public void run()

作为练习,我编写了以下代码来实践生产者/消费者模式:

public class Producer implements Runnable {
    BlockingQueue<Entity> entities;

    public Producer(BlockingQueue<Entity> entities) {
        this.entities = entities;
    }

    @Override
    public void run() {
        for (int i = 0; i <= 20; i++) {
            Entity en = new Entity();
            System.out.println("Producing entity: " + Integer.toString(i));
            en.setName(Integer.toString(i));
            entities.add(en);
        }
    }
}

public class Consumer implements Runnable {
    BlockingQueue<Entity> entities;

    public Consumer(BlockingQueue<Entity> entities) {
        this.entities = entities;
    }

    @Override
    public void run() {
        try {
            while (true) {
                System.out.println("Consuming entity: "
                  + entities.take().getName());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


public class MainPCClass {
    BlockingQueue<Entity> entities = new LinkedBlockingQueue<Entity>(5);

    public void start(){
        //start the producer
        new Thread(new Producer(entities)).start();
        //start the consumer
        new Thread(new Consumer(entities)).start();
    }
}
我希望,考虑到消费者的上述情况,我的程序永远不会结束,消费者线程也会被阻塞,因为在生产者生产完所有内容后,队列是空的。为什么呢?我错过什么了吗?我做错什么了吗?我的程序运行和结束都非常顺利

您的程序永远不会停止,因为您使用的线程未设置为守护进程线程。只有当所有剩余线程都是守护进程线程时,JVM才会完成

运行程序时,您可能会得到一个非法状态异常:队列已满,因为生产者超出了您设置列表的5的限制


您的期望是合理的-您如何运行您的程序?有什么打印出来的吗?你的方法是从哪里开始的线程?从它看,生产者应该添加20个作业,然后完成。消费者将在第20个工作岗位后封锁,等待下一个工作岗位。您得到的输出是什么?我唯一能看到的可能会混淆事情的是add的使用。因为您有一个有界队列,当队列已满时调用add时,队列将抛出RuntimeException。但是,只有生产者线程应该死亡,消费者线程应该继续运行。由于某些原因,在重新启动我的IDE后,一切正常!很奇怪!