Why does waitTillReady come after doOperation?  It doesn't seem like that will affect the degree of concurrency with which the threads run doOperation; only when they exit, which doesn't matter.