这是我的伪代码:
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(new Builder(childObj, pool)) ,因此我的对象没有设置所有内容并且不完整。我想将 pool.submit 返回的所有 Futures 放入阻塞队列中 - 但是我不知道如何通知调用者我的树遍历已完成。当树遍历完成时,我确实有一个计数器达到 0,但是由于客户端正在提交一个顶级节点,我不确定如何让它在 Java-ee 中等待而没有 while(isCounter = 0) - 这是一个 CPU 猪。
任何指针?