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子类实例设置不同的线程,因为目前我正在按顺序通知每个观察者,这可能会导致延迟.
在这里做一些简化的假设,即您不关心在吃/喝结束时收到通知,您还可以使用执行器框架将工作放入队列中:
// 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)