【发布时间】:2015-02-03 18:19:50
【问题描述】:
我已经开始学习线程并使用JDK 5.0中引入的并发包尝试Java中的生产者消费者问题我编写了以下代码:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class Producer implements Runnable {
private final BlockingQueue<Integer> objqueue;
Producer(BlockingQueue<Integer> obj) {
objqueue = obj;
}
@Override
public void run() {
int i = 0;
while (i < 10) {
try {
System.out.println("Put : " + i);
objqueue.put(i);
} catch (InterruptedException e) {
}
i++;
}
}
}
class Consumer implements Runnable {
private final BlockingQueue<Integer> objqueue;
Consumer(BlockingQueue<Integer> obj) {
objqueue = obj;
}
@Override
public void run() {
while (true) {
try {
System.out.println("Got : " + objqueue.take());
} catch (InterruptedException e) {
}
}
}
}
public class PCMain {
public static void main(String[] args) {
// create shared object
BlockingQueue<Integer> obj = new LinkedBlockingQueue<Integer>();
Thread prod = new Thread(new Producer(obj));
Thread cons = new Thread(new Consumer(obj));
prod.start();
cons.start();
}
}
当生产者生产最多 9 个而消费者消耗最多 9 个时,程序没有终止。我应该删除消费者中永远为真的 while 循环吗?
我怎样才能为不止一个生产者和一个消费者做到这一点? 谢谢。
【问题讨论】:
-
为什么要终止?
-
当生产者停止生产时,程序不应该终止吗?
-
好吧,我没有看到 main 方法,所以我们不知道你是如何调用它的,或者你试图停止代码是什么。但总的来说,不,它不会自行停止。
-
当所有非守护线程停止运行时,程序停止。不是当 1 个非守护线程停止运行时。
-
不久前我为朋友写了一个示例,我使用了
ExecutorService和明确的shutdown()调用,所以有很多方法可以做到这一点。因此:需要查看 main 方法。
标签: java multithreading