Вы правы. Поскольку ExecutorService
, который вы используете, был создан с использованием newSingleThreadExecutor
, шаг 5 будет выполнен после завершения шага 3. Чтобы выполнить два действия асинхронно, используйте newFixedThreadExecutor
:
public class MyTaskImpl {
private static final ExecutorService JOB_EXEC_SVC = Executors.newFixedThreadExecutor(2);
public void doTask() throws Exception {
// Step 1
// Step 2
// Step 3 (below)
JOB_EXEC_SVC.execute(() -> step3(param1, param2));
// Step 4
// Step 5 (below)
JOB_EXEC_SVC.execute(() -> step5(param));
}
}
Это, однако, не гарантирует, что шаг 3 и шаг 5 будут выполняться параллельно. Например, если выполнение шага 4 занимает много времени, шаг 5 может быть передан в ExecutorService
(т.е. вызывается execute
) после того, как шаг 3 уже завершил выполнение.
Это также верно для однопоточного случая, но независимо от времени, которое занимает шаг 4, шаг 5 всегда будет выполняться после завершения шага 3 (но неясно, будет ли передан шаг 5, когда шаг 3 выполняется и блокируется пока шаг 3 не завершится или если шаг 5 будет отправлен после завершения шага 3).