@WTFAYD

Каким образом компилятор одновременно запускает задачи в цикле for?

Здравствуйте!

Допустим, есть код:
ExecutorService exec = Executors.newThreadCachedPool();
for(int i = 0; i < 10; i++)
    exec.execute(new SomeRunnable());

Каким образом компилятор запускает все 10 задач одновременно, если, как я понимаю, цикл for представляет собой последовательную итерацию от 0го до 9го элемента; следовательно, между запуском потоков (особенно между первым и последним) должна быть некоторая задержка. Как вообще можно составить многопоточный код в коде, если сам код представляет собой некий последовательный алгоритм команд? Запутался немного.

Спасибо.
  • Вопрос задан
  • 236 просмотров
Решения вопроса 1
roswell
@roswell
и швец, и жнец, и на дуде игрец
Запускает не компилятор, а среда исполнения, причём ExecutorService запускает каждый процесс в его собственном асинхронном потоке. Задержка между итерациями в цикле присутствует, но её можно принять практически равной нулю. Кстати, всё же Executors.newCachedThreadPool().
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Alexander1705
Во-первых, компилятор ничего не запускает, а только компилирует программу.
Во-вторых задачи запускаться не одновременно, а последовательно, так как вы и ожидали. Но так как задачи запускаются в новом потоке, программа не ждёт их завершения перед запуском следующей.
Задержка между запусками есть, но она незначительна.
Ответ написан
Комментировать
GavriKos
@GavriKos
1) Компилятор вообще ничерта не запускает из вашего кода.
2) Ну как как. Создал поток, поток работает отдельно - цикл пошел дальше. Задержка тупо на создание потока, но не на его логику выполнения.

если сам код представляет собой некий последовательный алгоритм команд

Да. В рамках одного потока это верно. А в рамках нескольких - нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы