tl; dr
Если результаты, которые вы смотрите, поступают не по порядку, производятся асинхронно, то все в порядке.Асинхронная работа выполняется на отдельной временной шкале.По определению, асинхронная работа, запускаемая задачей № 1, может не завершиться до тех пор, пока все задачи 1, 2 и 3 не будут выполнены (например).
Асинхронный означает «не жди меня»
Вы упомянули:
MyTask выполняет некоторую асинхронную операцию
Асинхронное выполнение означает, что вызывающему коду не нужно ждать завершения асинхронной операции.
Вызывающий код, ваша задача, переданная в службу исполнителя, выполняет запрос на выполнение асинхронной работы, и задача немедленно продолжается.Если эта задача не имеет дальнейшей работы, задача завершена.Таким образом, служба исполнителя может двигаться дальше.
Служба исполнителя продолжает работу.Служба исполнителя выполняет вторую отправленную задачу.Между тем, запрошенная выше асинхронная работа может быть еще не выполнена.Возможно, асинхронная работа ожидает ресурса, такого как ожидание возврата вызова по сети, или асинхронная работа ожидает выполнения запроса к базе данных.Это, по определению асинхронного , не блокирует задачу, переданную исполнителю.Служба executor теперь выполняет 2-ю отправленную задачу и может быть третьей или четвертой, прежде чем, наконец, ваша асинхронная работа завершится.
Функция, а не ошибка
Другими словами, функция, а не ошибка.ExecutorService
, возвращаемый Executors.newSingleThreadExecutor()
, выполнил свое обещание «Задачи гарантированно выполняются последовательно».Тот факт, что в качестве побочного продукта одна из этих задач приводит к асинхронной работе, не меняет тот факт, что представленные задачи действительно выполнялись в их последовательном порядке.