ブロックコレクションごとに
-
21-12-2019 - |
質問
LinkedBlockingQueueキューのインスタンスを持っているとします。そしてこのキューでそれぞれに使用したい:
for(Object obj : queue) {
//do smth
}
.
現在の範囲でキューが空の場合はどのように動作するのでしょうか。キューが空になるまで実行中の実行をブロックしますか?
ありがとう!
解決
ブロックしない、それは単にループブランチに入りません。
簡単に確認できます。
LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
for (Object obj : queue) {
System.out.println("Inside the loop, is empty? " + queue.isEmpty());
}
System.out.println("Not blocking, is empty? " + queue.isEmpty());
.
出力:Not blocking, is empty? true
他のヒント
いいえ、それはブロックされない(デモ)。
Javaのfor
- 各ループはコレクションからiterator
を取得し、そのイテレータを使用してコレクションをトラバースします。 ドキュメント< / a>、LinkedBlockingQueue<T>
コレクションのイテレータは、イテレータが構築されたときのキューの状態を反映しています。
返却されたイテレータは、
ConcurrentModificationException
を投げることは決してないで、イテレータの構築時に存在しているため、トラバース要素を保証する「弱い一貫した」イテレータです。
イテレータが構築されたときにキューは空いているので、イテレータはより多くのデータが利用可能になるのを待ち、追加の要素がないことを報告します。もちろん、イテレータの構築後にコレクションが空でない場合、イテレータは新たに挿入された項目のいくつかを返します。
所属していません StackOverflow