0

現在、私は必要な問題に取り組んでいます

  1. 修正する要素の数。
  2. 固定サイズを超える場合、前の要素を削除します。削除ポリシーは現在修正されています
  3. LinkedHashMap1つのオプションですが、コレクションを並行させる必要があります。
  4. のような機能をサポートする必要BoundedQueueがありますが、それをエンキューするスレッドは決してブロックされるべきではなく、代わりに古い要素が削除され、新しい要素が挿入される必要があります。
  5. PriorityBlockingQueuewith drainTomethod は有効なオプションですが、要素を挿入する前に毎回呼び出す必要があります。

解決策を教えてください。ソースコードは不要です。問題を解決する最善の方法だけを知りたい。

前もって感謝します。

4

2 に答える 2

1

封じ込め赤ちゃん。

public class MyCollection {

  private LinkedBlockingQueue<MyData> lbq = new LinkedBlockingQueue<MyData>();
  public static final int MAX_SIZE = 5;

  public void add(MyData input) {
    lbq.put(input);
    if(lbq > MAX_SIZE) lbq.poll();
  }


  ... any other methods you need. 
}

これはあなたのニーズにぴったり合っているとは限りませんが、これで正しい方向に進むことができます。既存のデータ構造を使用し、それをカスタム コード (スレッド セーフにすることを含む) でラップすると、必要なものを正確に取得できます。

私がEffective C++から学んだと思う設計の基本的な概念は、継承よりも包含が好まれるということです。この場合は解決策です。

于 2013-04-10T09:44:05.437 に答える
0

最も簡単な出発点は、JDK の LinkedBlockingQueue を見て、過剰なプットとオファーの処理方法が異なる代替実装を作成することです。これはプライベート ロックを保持している間に発生するため、サブクラスで動作をオーバーライドすることはできません。

于 2013-04-10T10:13:08.010 に答える