为什么我的Producer Consumer计划结束了?

时间:2013-09-22 17:23:08

标签: java multithreading producer-consumer

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

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),我的程序永远不会结束,并且在生产者生成所有内容之后队列为空时,消费者线程会被阻塞。这是为什么?我错过了什么吗?难道我做错了什么?我的程序运行顺利。

1 个答案:

答案 0 :(得分:0)

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

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