【问题标题】:Why my Producer Consumer program ends?为什么我的生产者消费者计划结束?
【发布时间】:2013-09-22 17:23:07
【问题描述】:

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

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();
    }
}

我希望考虑到上述消费者中的 while(true),我的程序永远不会结束,并且消费者线程在生产者生产完所有内容后队列为空而被阻塞。这是为什么?我错过了什么吗?难道我做错了什么?我的程序运行和结束非常顺利。

【问题讨论】:

  • 您的期望是合理的——您如何运行您的程序?有什么打印出来的吗?
  • 你的启动线程的方法在哪里?
  • 从外观上看,生产者应该添加20个工作,然后完成。消费者将在第 20 个工作之后阻塞,等待下一个。你得到什么输出?
  • 我唯一能看到的可能会让人困惑的是add的使用。因为您有一个有界队列,当队列已满时调用 add 时,队列将抛出 RuntimeException。但是,只有您的生产者线程应该终止,而消费者线程应该继续运行。
  • 出于某种原因,重新启动我的 IDE 后,一切都按预期工作!很奇怪!

标签: java multithreading producer-consumer


【解决方案1】:
  • 您的程序永远不会停止,因为您使用的线程未设置为守护线程。仅当所有剩余线程都是守护线程时,JVM 才会完成。

  • 运行您的程序时,您可能会得到一个IllegalStateException: Queue full,因为生产者超出了您为列表设置的 5 个限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多