JavaのLinkedBlockingDequeを使用して生産者/消費者パターンを実装しましたが、アイテム(すでにキューのどこかにある)をキューの先頭に移動したい場合があるため、より早く処理されるという問題が発生しました。すでにキューに入れられているアイテムのどれが前に移動するのが良いかはわかりません。そこで、LinkedBlockingDequeを何かに置き換えて、アイテムを並べ替えることができるようにしたいと思います。1つのプロデューサーと2〜4つのコンシューマー(カスタムスレッド実装)があり、Androidプラットフォームを使用しています。これどうやってするの?いくつかのブロッキング二重接続リンクリスト?
2 に答える
私のコメントから:
を使用remove(Object o)
してオブジェクトを取得し、キューから削除してから、を使用してオブジェクトをキューaddFirst(Object o)
の先頭に追加できます。これには、このオブジェクトに優先順位を付ける効果があります。
イテレータを使用して、Deque内にあるオブジェクトを確認します。ConcurrentModificationException
ただし、あるスレッドでコレクションにアクセスし、別のスレッドでコレクションを変更している場合は発生する可能性があるため、十分に注意してください。ただし、blockingQueueを使用している場合、これは問題にはなりません。
BlockingQueue Javadocから:
BlockingQueueの実装はスレッドセーフです。すべてのキューイングメソッドは、内部ロックまたは他の形式の同時実行制御を使用して、アトミックにその効果を実現します。ただし、一括収集操作addAll、containsAll、retainAll、およびremoveAllは、実装で特に指定されていない限り、必ずしもアトミックに実行されるとは限りません。したがって、たとえば、cの要素の一部のみを追加した後、addAll(c)が失敗する(例外をスローする)可能性があります。
PriorityBlockingQueueをご覧ください。それはおそらくあなたのニーズに合うでしょう。名目上の優先度でアイテムを挿入できます。次に、要素の優先度の一部を調整する場合は、そのアイテムをキューから削除して、新しい優先度で再度追加します。