Java中的生产者消费者

时间:2012-04-13 17:52:38

标签: java producer-consumer blockingqueue

我写了下面的代码,但我觉得我在某个地方出错:

public class ProcessQueue {

static BlockingQueue<String> queue = new LinkedBlockingQueue<String>();

public ProcessQueue() {
    process();
}

public void add(String message) throws InterruptedException {
    System.out.println("Added Queue size:" + queue.size());
    System.out.println("Locked by Producer");
    queue.put(message);
    System.out.println("Lock Released by Producer");
}

public static void process() {
    new Thread() {

        @Override
        public void run() {
            try {
                while (true) {
                    System.out.println("Locked by Consumer");
                    Message.send(queue.take());
                    System.out.println("Locked Released by Consumer");
                    System.out.println("Consuming Queue size:" + queue.size());
                }
            } catch (Exception ex) {
                System.out.print(ex.getMessage());
            }
        }
    }.start();
}
}

这里add(String)将字符串添加到队列中。只要从UDP端口接收输入,就会调用它。 process()处理队列并将其发送到Message类。输出锁定和释放的打印语句不是所需的顺序。

修改

我的预期答案应该是: 如果它在生产者中是添加然后由生产者锁定 - &gt;然后添加到队列 - &gt;锁定释放。同样的方式将是消费者。但是操作不应该交错,即一旦被生产者锁定,它就不应该被消费者锁定然后释放锁定。

1 个答案:

答案 0 :(得分:3)

此处阻塞将在此处发生的唯一时间是在队列为空时进行。否则看跌将继续发生。因此,您可能会看到队列的大小不会增加1。您可能希望对LinkedBlockingQueue设置绑定。这是LBQ的默认无界限

根据您的修改进行修改:

到目前为止,我的答案是解释你所看到的和为什么。您正在寻找同步消息传递队列。您可以使用以下方法执行此操作:

new SynchrnousQueue();
new LinkedBlockingQueue(1);
new ArrayBlockingQueue(1);
new TransferQueue();

SynchrnousQueue完全符合您的要求。带有1的界限的Linked&amp; ArrayBlockingQueue也是如此。 TransferQueue是Java 7中提供的一个新队列,它具有等待线程准备好获取的transfer个方法。