public void complete ( ) { // we have to traverse up to our parent, so be careful about locking. Progress myParent ; synchronized ( this ) { progress = 1.0f ; myParent = parent ; } if ( myParent != null ) { // this will synchronize on the parent, so we make sure we release // our lock before getting the parent's, since we're traversing // against the normal traversal direction used by get() or toString(). // We don't need transactional semantics, so we're OK doing this. myParent . startNextPhase ( ) ; } }
Completes this node moving the parent node to its next child .