并发观察者模式

sne*_*ze1 6 java concurrency multithreading observer-pattern

如果我遇到以下情况:

ObserverA,ObserverB,ObserverC都继承自AbstractObserver.

我创建了一个观察者列表:

List<AbstractObserver> list = new ArrayList<AbstractObserver>();
list.add(new ObserverA());
list.add(new ObserverB());
list.add(new ObserverC());
Run Code Online (Sandbox Code Playgroud)

并且具有以下方法的某种处理程序在"MAIN"线程中运行:

public void eat(Food item) {
     for(AbstractObserver o : list) {
          o.eatFood(item);
     }
}

public void drink(Coffee cup) {
     for(AbstractObserver o : list) {
          o.drinkCoffee(cup);
     }
}
Run Code Online (Sandbox Code Playgroud)

我如何设计一个系统,我可以在不同的线程中运行每个eatFood和drinkCoffee方法的观察者?具体来说,当"MAIN"线程收到事件(饮料或吃方法被调用)时,如何在ObserverA,ObserverB和ObserverC中运行自己的线程中的eatFood或drinkCoffee方法?

我想为每个AbstractObserver子类实例设置不同的线程,因为目前我正在按顺序通知每个观察者,这可能会导致延迟.

JVM*_*ATL 4

在这里做一些简化的假设,即您不关心在吃/喝结束时收到通知,您还可以使用执行器框架将工作放入队列中:

  // declare the work queue
   private final Executor workQueue = Executors.newCachedThreadPool(); 




   // when you want to eat, schedule a bunch of 'eating' jobs
       public void eat(final Food item){
          for (final AbstractObserver o: list) {
             workQueue.execute(new Runnable() {

                @Override
                public void run() {
                   o.eatFood(item); // runs in background thread
                }
             });
          }
       }
Run Code Online (Sandbox Code Playgroud)

退出程序时,您必须关闭执行器:

   workQueue.shutdown();
Run Code Online (Sandbox Code Playgroud)