java - BlockingQueue程序不退出

标签 java multithreading

我指的是 BlockingQue 的概念,我找到了一个例子 here .

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; /*  j  a  v a  2s . co  m*/
public class Main {
    public static void main(String[] argv) throws Exception {
        int capacity = 10;
        BlockingQueue < Integer > queue = new ArrayBlockingQueue < Integer > (capacity);

        int numWorkers = 2;
        Worker[] workers = new Worker[numWorkers];
        for (int i = 0; i < workers.length; i++) {
            workers[i] = new Worker(queue);
            workers[i].start();
        }

        for (int i = 0; i < 10; i++) {
            queue.put(i);
        }
    }
}

class Worker extends Thread {
    BlockingQueue < Integer > q;

    Worker(BlockingQueue < Integer > q) {
        this.q = q;
    }

    public void run() {
        try {
            while (true) {
                Integer x = q.take();
                if (x == null) {
                    break;
                }
                System.out.println(x);
            }
        } catch (InterruptedException e) {}
    }
}

在示例中,他们仅使用了一个线程,即工作线程。

我对 BlockingQue 的理解是,它是生产者-消费者模式的替代解决方案。

所以我们需要两个线程来工作。因此我有疑问/疑问。

以下是我的问题。

  1. 他们是否将主线程用作另一个线程?

  2. 当我运行应用程序时,程序不会退出。我不明白主程序不退出的原因是什么?

最佳答案

在您引用的示例代码中,您有一个生产者(线程)和两个消费者(工作人员 线程)。

在生产者 - 消费者问题中,不一定只有一个生产者和一个消费者 - 可以有多个生产者和多个消费者。他们的相对数量通常取决于谁正在执行更复杂和耗时的任务。

答案 1: 主线程 是生产者线程,因为它用于将项目放入 BlockingQueuequeue.put(我)

答案 2:您的主线程在将 10 个元素放入队列后退出,但您的工作线程仍在等待元素(即使在消耗了 10 个元素之后),因为 q.take() 是一种阻塞方法,即它等待更多元素放入队列(当 queue 为空时)

解决方案:您需要将两个EOF元素/对象(END OF FILE)放入队列并像您一样进行检查,if (x == null)。尝试在队列中放入两个额外的空值,这样当您的工作/消费者线程找到它时,它们就会终止。目前,您的条件 if (x == null) 从未得到满足。

关于java - BlockingQueue程序不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38650035/

相关文章:

java - 在 MySQL 中存储为 DATE 的 LocalDate 返回不同的结果

java - 在 Netbeans 中创建 JAR 文件时出现 list 文件问题

java - SAXParser 说 :"java.net.SocketException: Network is unreachable"但 xmlint 或 curl 都可以

c++ - std::thread 从线程函数内部释放

java - 杀死java中的无限循环线程

java - 使用枚举键和不同值类型进行映射

java - 创建 bean 时出错

java - 这个java应用程序如何在不扩展线程或实现runnable的情况下运行多个线程?

python - 多线程 Python 文件系统爬虫

c# - 数据库发生死锁,但为什么?