オブジェクト 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 でキューに入れられます。これは、それらがワークキューに 2 回存在する可能性があり、同時に 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);
}
}
}
}