私はLinkedBlockingQueueを使って他のスレッドからのメッセージオブジェクトを処理しています。私は別のスレッドからの新しいメッセージを追加するとJava:オブジェクトのリストとのput()の同期
LinkedBlockingQueue<Message> message_queue = new LinkedBlockingQueue<Message>();
public void run(){
while(true){
Message m = message_queue.take();
handle_message(m);
}
}
が、私は(M)message_queue.putを呼び出します。たとえば、私はこのような何かを持っています。問題ない!私の質問は次のとおりです:
一度に一組のメッセージを一斉に追加するにはどうすればよいですか?のは、私はこれをしたいとしましょう:
Message[] messages = {/* some list of message objects */};
for (Message m : messages){
message_queue.put(m);
}
問題は、別のスレッドが同じことをやっている可能性があることですし、一つのスレッドからのメッセージは、私が意図したとおりにキューに登録されることが保証されていません。競合するスレッドからのメッセージは、間に「インターリーブ」されることがあります(つまり、実際のシーケンスは、A、A、A、B、B、Bの代わりにA、A、B、B、A、Bになります) "put"の例のループを "synchronized(message_queue){}"ブロックに入れることができますが、同じブロックを.take()の呼び出しの周りに置く必要がありますか?そして、明らかに、デッドロック状況を即座に作り出すので、私はそれを行うことはできません。新しいMessageがput()されるまでブロックします。これは同期によってロックされても起こりません。 take()コールでsynchronizedブロックをスキップし、putループの同期ブロックのみを持ち、目的の効果を得ることはできますか?ありがとう!
は、合意された:のみ発注の問題がかどうかであります2つのバルクプット操作が互いに衝突するか、または1つのプット操作で衝突します。 –