为什么当消费线程全部退出时所有生产者线程也退出

时间:2018-07-09 10:05:32

标签: java multithreading blockingqueue

我正在运行以下代码,并且我有一个问题:

当使用者线程全部退出时,为什么所有生产者线程也会退出。

代码如下:

public class NumbersConsumer implements Runnable {
    private final BlockingQueue<Integer> queue;
    private final int poisonPill;

    NumbersConsumer(BlockingQueue<Integer> queue, int poisonPill) {
        this.queue = queue;
        this.poisonPill = poisonPill;
    }

    public void run() {
        try {
            while (true) {
                Integer number = queue.take();
                if (number.equals(poisonPill)) {
                    return;
                }
                String result = number.toString();
                System.out.println(Thread.currentThread().getName() + " result: " + result);
            }
        } catch (InterruptedException e) {

            System.out.println(e.getStackTrace());
            Thread.currentThread().interrupt();
        }
    }
}

制作人:

public class NumbersProducer implements Runnable {  
    private final BlockingQueue<Integer> numbersQueue;
    private final int poisonPill;
    private final int poisonPillPerProducer;

    NumbersProducer(BlockingQueue<Integer> numbersQueue, int poisonPill, int poisonPillPerProducer) {
        this.numbersQueue = numbersQueue;
        this.poisonPill = poisonPill;
        this.poisonPillPerProducer = poisonPillPerProducer;
    }

    public void run() {
        try {
            generateNumbers();
        } catch (InterruptedException e) {

            System.out.println(e.getStackTrace());
            Thread.currentThread()
                .interrupt();
        }
    }

    private void generateNumbers() throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            numbersQueue.put(ThreadLocalRandom.current()
                .nextInt(100));
        }
        for (int j = 0; j < poisonPillPerProducer; j++) {
            numbersQueue.put(poisonPill);
        }
    }
}

测试器:

public class BlockingQueueUsage {
    public static void main(String[] args) {
        int BOUND = 10;
        int N_PRODUCERS = 4;
        int N_CONSUMERS = Runtime.getRuntime().availableProcessors();
        int poisonPill = Integer.MAX_VALUE;

        int poisonPillPerProducer =N_CONSUMERS / N_PRODUCERS ;

        System.out.printf("poisonPillPerProducer:%s,N_CONSUMERS:%s %n",poisonPillPerProducer,N_CONSUMERS);

        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(BOUND);

        for (int i = 0; i < N_PRODUCERS; i++) {    
            new Thread(new NumbersProducer(queue, poisonPill, poisonPillPerProducer),"Producer"+i).start();    
        }

        for (int j = 0; j < N_CONSUMERS; j++) {    
            new Thread(new NumbersConsumer(queue, poisonPill),"comsumer"+j).start();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

简单:制作人缺少循环。

除了 produce 某些数字外,农产品无能为力,而那种毒药会终结消费者。

另一方面,消费者将永远消费……直到药丸进来。

换句话说:您的制作人“结束了”,因为他们并不是为了生存而设计的。