我写了下面的代码,但我觉得我在某个地方出错:
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;锁定释放。同样的方式将是消费者。但是操作不应该交错,即一旦被生产者锁定,它就不应该被消费者锁定然后释放锁定。
答案 0 :(得分:3)
此处阻塞将在此处发生的唯一时间是在队列为空时进行。否则看跌将继续发生。因此,您可能会看到队列的大小不会增加1。您可能希望对LinkedBlockingQueue设置绑定。这是LBQ的默认无界限
根据您的修改进行修改:
到目前为止,我的答案是解释你所看到的和为什么。您正在寻找同步消息传递队列。您可以使用以下方法执行此操作:
new SynchrnousQueue();
new LinkedBlockingQueue(1);
new ArrayBlockingQueue(1);
new TransferQueue();
SynchrnousQueue完全符合您的要求。带有1的界限的Linked&amp; ArrayBlockingQueue也是如此。 TransferQueue是Java 7中提供的一个新队列,它具有等待线程准备好获取的transfer
个方法。