1

这个问题与我目前的实施遇到的问题有关。因此,我想知道是否有一种方法可以完全不同地实现它。

我有一个由多个线程更新的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()
4

1 回答 1

0

我有两个建议: 1. 每个观察者都有一个成员,它保存加载到观察者的最后一个索引的索引,并且在通知观察者的代码中,您将返回在索引之后添加的元素。2.如果你有大量的观察者比添加更多,也许你应该使用读写锁而不是同步。

于 2013-02-18T12:59:05.757 回答