首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生产者使用者使用阻塞队列

生产者使用者使用阻塞队列
EN

Stack Overflow用户
提问于 2015-02-03 18:19:50
回答 3查看 302关注 0票数 0

我已经开始学习线程,并尝试使用JDK5.0中引入的并发包在Java中解决生产者消费者问题,我编写了以下代码:

代码语言:javascript
复制
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循环,这在使用者中是永远正确的。

我怎样才能为一个以上的生产者和一个消费者?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-03 18:43:25

您有两个线程,一个应该停止一次i == 10。不过,另一个线程处于无限循环中。您需要向消费线程发出信号,说明应用程序应该结束。将毒丸看作是通知第二个线程停止的一种方式。

在消耗线程完成之前,程序本身不会停止。

票数 1
EN

Stack Overflow用户

发布于 2015-02-03 18:34:03

删除while循环将导致使用者只消耗生产者给出的一个对象。

最好是去异常框架。它的线程工厂和线程Pool.You可以用来实现同样的。

票数 0
EN

Stack Overflow用户

发布于 2015-02-03 18:41:41

我认为“修复”代码的最简单的方法是使使用者成为一个守护进程线程。

代码语言:javascript
复制
Thread prod = new Thread(new Producer(obj));
Thread cons = new Thread(new Consumer(obj));

cons.setDaemon( true );
prod.start();
cons.start();

这确实不是一个通用的解决方案,但是当发出停止线程的信号不方便时,要记住这是一个很好的技巧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28305983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档