は私の擬似コードです:Java-eeで再帰ツリーを構築するには?ここ
class Builder implements Callable<T> {
T obj;
ManagedExecutorService pool;
Builder (T obj, ManagedExecutorService pool){
this.obj = obj;
this.pool = pool;
}
T call(){
build();
}
private void build(){
// skip if already traversed
return isTraversed(obj);
// call db and get obj's one-to-many relationships
Collection<T> colOfChildObj = DbUtil.getChildrenPOJO(obj);
for (<Collection>T childObj : colOfChildObj){
this.pool.submit(new Builder(childObj, this.pool));
}
// set children as-is, when the submit above completes,
// it will update childObj and thus will reflect
// obj.childObj.itsChidren etc. For this though the caller
// has to wait until all submits are processed
obj.setChildren(colOfChildObj);
}
}
のJava-EEはForkJoinPoolサポートしていないので - 問題外です。それでは、ManagedThreadFactoryとManagedExecutorServiceのどちらを使ってそれをやりますか?私の本当の挑戦は、Java-eeでpool.shutdown()またはpool.awaitTerminationを呼び出せないことが原因です。私がやるのであれば、発信者からの、:
class Caller() {
T getObjGraph(T rootObj){
pool.submit(new Builder(rootObj));
T objGraph = pool.get();
return objGraph;
}
}
その後、私の方法は、すべてのpool.submit(新しいビルダー(childObj、プール))を待たないので、私のオブジェクトは、すべてが設定され、不完全である持っていません。 pool.submitによって返されたすべてのFuturesをブロッキングキューに入れることを考えましたが、私はツリートラバーサルが完了したことを呼び出し元に通知する方法がわかりません。私は、ツリートラバーサルが完了したときに0に達するカウンタを持っていますが、クライアントがトップレベルのノードを送信しているので、while(isCounter = 0)なしでJava-eeで待機する方法がわかりません。 CPUの豚。
任意のポインタ?
達成しようとしていることを説明してください。タイトルは、あなたがツリーを構築しようとしていることを示唆しています。しかし、問題はあなたが何かをしようとしていることを示唆しています(しかし何ですか?)同時に。あなたは何を達成しようとしていますか?複数のスレッドから管理されたJPAエンティティを処理しようとしているようです。これはすでに間違っています。マネージエンティティはスレッドセーフではありません。スレッドセーフではない永続コンテキストにリンクされています。 –
追加情報を参照してください。これらはManagedオブジェクトではなく、単にPOJOです。 – donlys