Java 通过观察者从已使用的线程列表中仅获取最新元素

Java 通过观察者从已使用的线程列表中仅获取最新元素,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,这个问题与我遇到的一个问题有关。因此,我想知道是否有一种完全不同的方法来实现它 我有一个由多个线程更新的java.util.concurrent列表。列表本身实现了可观察的,然后我还有另外两个观察者,他们在列表更改时得到通知 现在,观察者只能加载最新值(它们还没有),而不是列表中可能包含的所有千个值 当前概述如下: public class Observer1 implements Observable { } public class Observer2 implements Observa

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

我有一个由多个线程更新的
java.util.concurrent
列表。列表本身实现了
可观察的
,然后我还有另外两个
观察者
,他们在列表更改时得到通知

现在,
观察者
只能加载最新值(它们还没有),而不是列表中可能包含的所有千个值

当前概述如下:

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());
    }
}
公共类observer 1实现可观察{
}
公共类Observer2实现了Observable{
}
公共类MyList扩展了Observable{
私有SomeJavaConcurrentList;//(哪一个取决于您的答案)
公共同步无效加法器(T元素){
list.put(element);//或list.add(element);取决于上面的列表
setChanged();
通知观察员();
}
}
公共类MyThread实现可运行{
公开募捐{
MyList list=MyList.getInstance();
添加(“来自线程的新元素”+this.getName());
}
}
如何确保每个观察者只获取它尚未看到的条目

可能的问题:

  • 我能以某种方式删除上面的同步吗?当需要等待所有通知过程时,它可能会减慢程序的速度?但是,
    notifyObservers()
    可能会被多次调用
  • 我不能确定当调用观察员时,他们是否都有相同的状态。有人可能会说:“哦,我现在不更新自己,但下一轮我会更新所有内容。返回”,另一个会立即下载更改。因此,它们有不同的文件
  • 有多个观察者,因此我无法从列表中删除现有元素(如使用
    LinkedBlockingQueue.take()
    • 我有两个建议: 1.每个观察者都有一个成员,该成员保存加载到观察者的最后一个索引的索引,并且在通知观察者的代码中,您将返回在索引之后添加的元素。 2.如果您有大量的观察者,而不仅仅是添加,那么您可能应该使用readwritelock而不是synchronize