我已经开始学习线程,并尝试使用JDK5.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循环,这在使用者中是永远正确的。
我怎样才能为一个以上的生产者和一个消费者?谢谢。
发布于 2015-02-03 18:43:25
您有两个线程,一个应该停止一次i == 10。不过,另一个线程处于无限循环中。您需要向消费线程发出信号,说明应用程序应该结束。将毒丸看作是通知第二个线程停止的一种方式。
在消耗线程完成之前,程序本身不会停止。
发布于 2015-02-03 18:34:03
删除while循环将导致使用者只消耗生产者给出的一个对象。
最好是去异常框架。它的线程工厂和线程Pool.You可以用来实现同样的。
发布于 2015-02-03 18:41:41
我认为“修复”代码的最简单的方法是使使用者成为一个守护进程线程。。
Thread prod = new Thread(new Producer(obj));
Thread cons = new Thread(new Consumer(obj));
cons.setDaemon( true );
prod.start();
cons.start();这确实不是一个通用的解决方案,但是当发出停止线程的信号不方便时,要记住这是一个很好的技巧。
https://stackoverflow.com/questions/28305983
复制相似问题