【发布时间】:2010-11-18 16:30:08
【问题描述】:
我正在使用 LinkedBlockingQueue 来处理来自其他线程的消息对象。例如,我有这样的事情:
LinkedBlockingQueue<Message> message_queue = new LinkedBlockingQueue<Message>();
public void run(){
while(true){
Message m = message_queue.take();
handle_message(m);
}
}
当我从另一个线程添加新消息时,我调用 message_queue.put(m)。没问题!我的问题是这样的:
如何一次同步添加一组消息?假设我想这样做:
Message[] messages = {/* some list of message objects */};
for (Message m : messages){
message_queue.put(m);
}
问题是另一个线程可能正在做同样的事情,并且不能保证来自一个线程的消息完全按照我的意图排队。来自竞争线程的消息可以在两者之间“交错”(即实际序列可能最终是 A、A、B、B、A、B 而不是预期的 A、A、A、B、B、B)我知道我可以将“put”示例中的循环放入“synchronized(message_queue){}”块中,但我是否还需要将相同的块放在对 .take() 的调用周围?很明显,我不能这样做,因为它会立即造成死锁情况,因为 take() 会阻塞,直到有新的 Message 被 put() ,这在被同步锁定时不会发生。我可以跳过 take() 调用上的同步块,在 put 循环上只有一个同步块,并获得所需的效果吗?谢谢!
【问题讨论】:
标签: java multithreading