положенные в него таски будут выполняться в том же порядке, в котором кладутся. Почему?
Ведь, как я понял, там BlockingQueue, которая блочит все потоки, пока не появится новая таска, а как только появляется - она сразу идет в обработку (ну или кладется в ожидании свободного потока). В любом случае порядок сохраняется
Executor может исполнять задачи в нескольких потоках, поэтому говорить о порядке их выполнения в принципе бессмысленно.
если говорить про завершение таски - то это понятно, а если про начало?
таска же привязывается к исполняющемуся потоку, это же не корутина
Если вопрос про экзекьютор как интерфейс, то потому что интерфейс не накладывает таких ограничений. Если про конкретную имплементацию, то обеспечивать порядок запуска дороже чем не обеспечивать, поэтому могут быть всякие более расслабленные модели. Но что до имплементации из коробки, там я действительно ожидаю блокирующую очередь, и транзитивно порядок запуска* в порядке добавления. * Порядок извлечения из очереди. Никто не мешает одному потоку достать таску из очереди и заснуть, а другому достать следующую и запустить, или по каким-либо другим причинам оказаться более прытким, чем первый поток
Есть executor из двух потоков. Делаем туда два раза submit без задержек. Зачем в данной ситуации задерживать начало исполнения, если можно сразу начать исполнение?
Да, но разные задачи запускаются на разных потоках
ну так и получится, что порядок сохраняется: submit(task1) - уходит на Thread1; submit(task2) - уходит на Thread2; submit(task3) - кладется в BlockingQueue submin(task4) - так же кладется в BlockingQueue и когда Thread1 или Thread2 закончат свою работу - они возьмут именно task3 - т.е. порядок сохраняется;
Thread 1 достал таск 3 и был поставлен на паузу шедулером ОС Thread 2 достал таск 4 и тут же запустил Thread 1 проснулся и запустил 3
т.е. как бы порядок обработки сохраняется, но порядок выполнения не гарантирован?
Обсуждают сегодня