我有一个应用程序可以创建数百个对象 B 和 C 的实例。
有一个对象层次结构,其中对象 Foo 包含 2 个队列(b_queue 和 c_queue),一个填充 B 类型的对象,另一个填充 C 类型的对象。
当 B 或 C 中发生某些事件时,我希望它们将自己从对象 Foo 中的队列中删除。
我的解决方案是构造一个对象 B 或 C,将 Foo 的实例(称为 foo_inst)交给他们,将它们存储在其队列中。然后在 B 或 CI 内部可以调用 foo_inst.b_queue.remove(this)。
1)这将是一个好的/有效的方法,还是应该避免?
B 和 C 都是 Runnable 对象,将与 ThreadPoolExecutor 一起排队。这意味着它们可能会在工作队列上两次,并且可能会尝试同时调用 foo_inst.b_queue.remove(this),或者在它已经完成之后调用。
2)这也会造成问题吗?
非常感谢任何帮助或提示。
好的,到目前为止,我已经在一些帮助下做到了这一点。(欢迎更多帮助):
public class Foo implements Foo_interface{
ConcurrentHashMap<Key,B> b_map = new ConcurrentHashMap<Key,B>();
ConcurrentHashMap<Key,C> c_map = new ConcurrentHashMap<Key,C>();
public void removeB(Key k){
b_map.remove(k);
}
public void removeC(Key k){
c_map.remove(k);
}
private class B implements Runnable{
Foo foo_inst;
Key key;
public B(Foo foo,Key key){
this.foo=foo;
this.key=key;
}
public void run(){
try{
//some code
}catch(Exception e{
foo.removeB(key);
}
}
}
private class C implements Runnable{
Foo foo_inst;
Key key;
public C(Foo foo,Key key){
this.foo=foo;
this.key = key;
}
public void run(){
try{
//some code
}catch(Exception e{
foo.removeC(key);
}
}
}
}