この質問は、現在の実装で抱えている問題に関連しています。したがって、まったく異なる方法で実装する方法があるのではないかと考えています。
複数のスレッドによって更新されるリストがあります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()
)