nit: just use Executors.newCachedThreadPool() ? You don't really care about the timeouts or anything.