1

我已经编写了以下代码,但我觉得我在某个地方出错了:

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 类进行处理。输出 Locked and Released Print Statements 的顺序不理想。

编辑

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

4

1 回答 1

3

唯一一次阻塞发生在队列为空时。否则看跌期权将继续发生。所以你可能会看到队列的大小没有增加一。您可能希望对 LinkedBlockingQueue 设置一个界限。仅供参考,LBQ 是默认无界的

根据您的编辑进行编辑:

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

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

SynchrnousQueue 完全符合您的要求。边界为 1 的 Linked&ArrayBlockingQueue 几乎是一样的。TransferQueue 是 Java 7 中提供的一个新队列,它具有transfer等待线程准备好获取的方法。

于 2012-04-13T18:18:23.117 回答