У меня есть приложение, которое создает сотни экземпляров некоторых объектов B и C.
Существует иерархия объектов, в которой объект Foo содержит 2 очереди (b_queue и c_queue), одна из которых заполнена объектами типа B, а другая - объектами типа C.
Когда в B или C происходит какое-либо событие, я хочу, чтобы они удалили себя из очереди в объекте Foo.
Мое решение заключается в создании объекта B или C, чтобы передать им экземпляр Foo (назовите его foo_inst), который будет хранить их в своих очередях.
Затем внутри B или C я могу просто вызвать 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);
}
}
}
}