我指的是 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: 主线程 是生产者线程,因为它用于将项目放入 BlockingQueue
,queue.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/