Вам необходимо отправить задания в два пакета или иным образом создать явное отношение «происходит до». Предложите создать две партии заданий и использовать invokeAll(batch1); invokeAll(batch2);
Метод invokeAll()
выполнит все задачи и заблокирует их до завершения. Возможно, вам придется обернуть ваши Runnable
s как Callable
s, что вы можете сделать с Executors.callable(Runnable r)
. (@Cameron Skinner побеждает меня, чтобы получить пример кода, см. Ответ на этот вопрос подробнее ...)
Весь смысл исполнителей состоит в том, чтобы абстрагироваться от специфики исполнения, поэтому порядок не гарантируется, если явно не указано иное. Если вы хотите строго последовательное выполнение, сделайте это в потоке, в котором вы работаете (самый простой), сделайте это в однопоточном исполнителе, ala Executors.newSingleThreadExecutor()
, или явно синхронизируйте задачи. Если вы хотите сделать последнее, вы можете использовать барьер или защелку и иметь блок зависимых задач на барьере / защелке. Вы также можете иметь первый блок задач, реализующий Callable
, возвращающий Future
, и вызывать зависимые задачи myFuture.get()
, что заставит их блокироваться, пока не будут возвращены результаты.
Если вы скажете больше о вашем конкретном заявлении, мы сможем помочь вам более конкретно.