我指的是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的了解是,它是Producer-Consumer模式的替代解决方案。因此,我们需要两个线程进行处理。因此,我有疑问/疑问。以下是我的问题。他们有没有使用主线程作为另一个线程?当我运行该应用程序时,该程序不会退出。我不明白主程序为什么不退出的原因? 最佳答案 在您引用的示例代码中,您有一个生产者(Main线程)和两个消费者(Worker线程)。在生产者-消费者问题中,不必只有一个生产者和一个消费者-您可以有多个生产者和多个消费者。他们的相对人数通常取决于谁在执行更复杂,更耗时的任务。答案1:主线程是生产者线程,因为它用于将项目放入BlockingQueue,queue.put(i)答案2:您的主线程在将10个元素放入队列后退出,但您的工作线程一直在等待元素(即使在消耗了10个元素之后),因为q.take()是一种阻塞方法,即它等待将更多元素放入队列(当为空)解决方案:您需要将两个queue元素/ EOF(Objects)放入队列,并像您所做的那样进行检查,END OF FILE。尝试将两个额外的null放入队列中,以便当您的工作线程/消费者线程找到它时,它们将终止。当前,您的条件if (x == null)从未满足。关于java - BlockingQueue程序未退出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38650035/
10-12 05:52