Maybe tangential -- but should this just use the Utils.newCachedThreadPool() method?  It has a shorter timeout (60s instead of 10 min) but that seems maybe better.  Also it doesn't cap the maximum number of threads -- but I don't think that matters here since the scheduler implicitly caps the # of threads by limiting the number of tasks that it will launch concurrently on one machine.