I'll need to run into work to grab my JCIP book to verify, but I'm pretty sure we can do all this with the concurrency infra and both accomplish our goal and take advantage of the benefits.

A thread pool executor can be given a queue implementation for the tasks to implement.  If we make this a priority blocking queue then we can arbitrarially order tasks to be executed.  All we need to do is hand it ComparableFutureTasks that contain the connection task and are prioritized by queue position.

So, we could still have an executor manage the transferring, reducing resource usage, and adding stability, and, we can start with a thread pool of only 1 thread, matching the current model, but also have the ability to increase it trivially if desired (such as if we want to support concurrent transfers over wifi at some point in the future).