1

この質問は、現在の実装で抱えている問題に関連しています。したがって、まったく異なる方法で実装する方法があるのではないかと考えています。

複数のスレッドによって更新されるリストがありますjava.util.concurrent リスト自体が実装されており、リストが変更されたときに通知を受けるObservable他の2人がいます。Observers

これで、最新の値(まだ持っていない値)Observersのみが読み込まれ、リストに含まれる数千の値すべてが読み込まれるわけではありません。

現在の概要は次のとおりです。

public class Observer1 implements Observable {
}

public class Observer2 implements Observable {
}

public class MyList<T> extends Observable {
    private SomeJavaConcurrentList list; // (which one depends on your answer)

    public synchronized void addElement(T element) {
        list.put(element); // or list.add(element); depending on list above
        setChanged();
        notifyObservers();
    }
}

public class MyThread implements Runnable {
    public void run() {
        MyList list = MyList.getInstance();
        list.add("new element from thread " + this.getName());
    }
}

各オブザーバーがまだ見ていないエントリのみを確実に取得するにはどうすればよいですか?

考えられる問題:

  • どうにかして上記の同期を削除できますか? すべての通知プロセスを待機する必要がある場合、プログラムの速度が低下する可能性がありますか? ただし、notifyObservers()複数回呼び出される可能性があります。
  • オブザーバーが呼び出されたときにすべて同じ状態になっているかどうかはわかりません。「ああ、今は自分自身を更新しませんが、次のターンにすべてを更新します。戻る」と言うと、他の人は変更をすぐにダウンロードします。したがって、それらは異なるファイルを持っています。
  • 複数のオブザーバーがあるため、リストから既存の要素を削除できません (のようにLinkedBlockingQueue.take())
4

1 に答える 1

0

2 つの提案があります。1. 各オブザーバーには、オブザーバーに読み込まれた最後のインデックスのインデックスを保持するメンバーがあり、オブザーバーに通知するコードでは、インデックスの後に追加された要素を返します。2. 追加するよりもはるかに多数のオブザーバーがある場合は、同期する代わりに readwritelock を使用する必要があります。

于 2013-02-18T12:59:05.757 に答える