複数のスレッドからの挿入を許可するConcurrentLinkedQueueがありますが、キューをポーリングするときに1つの関数で行い、キューが空になるまでポーリングします。これは、ポーリング中にスレッドがキューに挿入される可能性があるため、無限ループにつながります。 キューのビューを作成してポーリング前に空にしても、スレッドセーフにするにはどうすればよいですか?無限ループを回避するためにキューをスナップショットする方法
答えて
私が見るものの1つの方法は、ConcurrentLinkedDeque
を使用して、最後に追加したアイテムに到達するまで繰り返します。単一の終了キューでこれを行うことはできません。なぜなら、読み取りが最初に頭を見て、最後に追加された要素を見つけるためにテールを読み取る必要があるからです。
ConcurrentLinkedDeque
が動作する方法は、offer(Object)
とadd(Object)
を呼び出すと、その項目がキューの末尾に配置されます。 poll()
への通話ので、同じように、キューの先頭を読みます:あなたはより多くの項目を追加
// Read direction --->
HEAD -> E1 -> E2 -> E3 = TAIL
// Write direction --->
として、尾は最後の要素を拡張しますが、我々は、我々は最後にそれを見たように、キューを空にしたいので、テールポインタをつかんで、テールに達するまで繰り返します。その後、キューを空にしている間に、追加されたものを後続の反復で扱うことができます。 We peek
最初にpoll
を使用すると、最後に追加された値が削除されるため、マーカーが削除されるため、要素の削除をいつ終了するかを判断できません。あなたがプロデューサのデフォルトoffer(Object)
とadd(Object)
としてプロデューサーのコードを変更する必要はありません
ConcurrentLinkedDeque<Object> deque = new ConcurrentLinkedDeque<>();
public void emptyCurrentView() {
Object tail = deque.peekLast();
if (tail != null) {
while (true) {
// Poll the current head
Object current = deque.poll();
// Process the element
process(current);
// If we finish processing the marker
// Exit the method
if (current == tail) {
return;
}
}
}
}
は、末尾に要素を追加することとまったく同じことを行います。
キューのビューを作成し、ポーリング前に空にしてもスレッドセーフであるようにするにはどうすればよいですか?
これは本当に悪いパターンのようです。並行キュー実装を使用するポイントは、同時にキューに追加したりキューから削除したりできる点です。あなたはConcurrentLinkedQueue
に固執したいなら、私はちょうどこのような何かをしたい:それはtake()
をサポートしているので
// run every so often
while (true) {
// returns null immediately if the queue is empty
Item item = blockingQueue.poll();
if (item == null) {
break;
}
// process the item...
}
しかし、私は、代わりにLinkedBlockingQueue
を使用するように切り替える検討します。
private final BlockingQueue<Item> blockingQueue = new LinkedBlockingQueue<>();
...
while (!Thread.currentThread().isInterrupted()) {
// wait for the queue to get an item
Item item = blockingQueue.take();
// process item...
}
BlockingQueue
そうpoll()
ループも利用可能であるQueue
を拡張する:消費者スレッドは、このようなループになるであろう。
- 1. python/scrapy質問:無限ループを回避する方法
- 2. Observablesで無限ループを回避する方法は?
- 3. このプログラムで無限ループを回避する方法
- 4. mod_rewrite - 無限ループを回避する方法
- 5. PHPの無限ループを検出して回避する方法
- 6. QThread:無限ループを止める方法
- 7. Cの電話帳プログラム:無限ループを回避する方法と、スイッチのステートメントメニューに戻る方法
- 8. PHP - htaccessによるリダイレクトの無限ループを回避するには
- 9. Pythonの無限ループのためタイムアウトになる方法
- 10. 無限ループを処理する方法
- 11. 方法メモリリークを回避するために、例外が
- 12. 無限回実行するループ
- 13. Laravel 5.1 Queue - キューを回避する方法:進行中のジョブをフェッチするための作業コマンド
- 14. 重複したループを回避する
- 15. randomForestを回避するためのRサンプリング32ファクタの制限
- 16. Matlab:ベイヤーパターンデモザイキングのためのループを回避する
- 17. 無限ループを止めるには?
- 18. try/catchを使用すると無限ループを回避するにはどうすればいいですか?
- 19. redirect_toでループを回避する方法:戻る?
- 20. 設定回数のループforループを無限ループwhileループに変更する
- 21. 矛盾した埋め込みドキュメントを回避する方法
- 22. リダイレクトチェーンを回避するための方法
- 23. リンクリスト優先度キューの無限ループ
- 24. 複数のao.lockの回避方法を回避するには?
- 25. Swiftのコンパイラエラーを回避するためにOptionalsを使用する方法
- 26. ループのための無限ループとデッドコード
- 27. Roblox無限回転ループ
- 28. 壊れた無限ループを停止する方法
- 29. Java 7 WatchService:ハンドラのイベントソースを変更するときに無限ループのイベントを回避する
- 30. 小道具に起因するこの無限ループを回避するためにReduxを使用する必要がありますか?
私はイテレータがあなたが探しているものだと思います。 – NAMS
@NAMS並行イテレータは弱く一貫性があります。その時のコレクションの視点である構築時に見られるものが保証されますが、繰り返しごとに要素がリークする可能性があります。追加するたびに100%の更新があれば、開始した場所に戻ります。 – xTrollxDudex
なぜ空になるまでキューからすべてを取り出さなければならないのですか?あなたは、アイテムを引き出し始める前に、キュー内の要素の数を取得し、多くのアイテムを最大限に取り出すような何かを行うことができます。または、1つを取り出してすぐに処理できます。 –