Mere moments ago, quoth I:
My point about the async calls is that because you're calling async and then future.get(), you're blocking the original thread waiting for something else, which allows the threadpool work to complete in the background, regardless of which threadpool the work was submitted to.
If you completely removed the future.get() calls (even if you still called async), then you might end up destroying the threadpool before it actually did the work, thus it would appear that submit() did nothing. (And the asyncs would also end up doing nothing.) But because like I said this is up to your OS's thread scheduler, it might sometimes make some progress on some of the work before actually being destroyed, which can be confusing.
If you have a sleep (or any other work running long enough) in there, so that you don't destroy the threadpool too soon, then it will complete in the background.
For another example, if you submitted some long-running tasks to ea and some short-running tasks to ea00, and then only waited on the futures from ea00, then they'd complete quickly and you'd exit those blocks and destroy both threadpools -- but ea's work is very likely to be incomplete or not even started yet. Conversely, submitting the same tasks to the same pools but instead waiting on futures from ea instead would increase your chances that both pools completed their work but it's still not entirely impossible that only ea finished and ea00 still had some unfinished work. (You'd have to have quite poor luck with the scheduler though.) Finally, submitting a task to ea, then async'ing a task also to ea, then waiting on that second task's future: this would guarantee that both tasks finished *only if there was exactly one thread in the pool*. If there's more than one thread then you could still get a situation where the second task finishes before the first. If you want to guarantee that everything completes before you stop then you need to wait for completion of everything in some fashion or another.