I think the way to look at this is to examine the non-trivial runAfter implementations. If they have common elements that can be helped by someutility classes, write those classes. If not, deal with each individually.We are now committed to 1.5, so if we did not have runAfter we could replace TaskManager with java.util.concurrent.ThreadPoolExecutor.
That's probably where we should be headed, since it reduces our maintenance burden.
Peter.