Iオブジェクトfooが有する2つのキュー(b_queueとc_queue)、タイプBのオブジェクトで満たされた一方及び他方を含むオブジェクトの階層があり、いくつかのオブジェクトBおよびCJava:キューからオブジェクトを同時に削除する。
のインスタンスの数百を作成するアプリケーションを持っています
BまたはCで何らかのイベントが発生した場合、オブジェクトFooのキューから自分自身を削除する必要があります。
私の解決策は、オブジェクトBまたはCの構築時に、Fooのインスタンス(foo_instと呼ぶ)を渡してキューに格納します。 次にBまたはCの中で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);
}
}
}
}
Java Concurrency Useというタイトルである必要があります。メモリの問題はどこで発生していますか? –