runs to completion on one thread