这个问题与我目前的实施遇到的问题有关。因此,我想知道是否有一种方法可以完全不同地实现它。
我有一个由多个线程更新的java.util.concurrent
列表。列表本身实现,然后我有另外Observable
两个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()
可能会被多次调用。 - 我不确定观察者在被调用时是否都具有相同的状态。有人可能会说:“哦,我现在不更新自己,但下一回合我会更新所有内容。返回”,另一个人会立即下载更改。因此他们有不同的文件。
- 有多个观察者,所以我不能从列表中删除现有元素(比如 with
LinkedBlockingQueue.take()
)