170 похожих чатов

Много где читал, что работа с Executor'ом не гарантирует, что

положенные в него таски будут выполняться в том же порядке, в котором кладутся. Почему?

Ведь, как я понял, там BlockingQueue, которая блочит все потоки, пока не появится новая таска, а как только появляется - она сразу идет в обработку (ну или кладется в ожидании свободного потока). В любом случае порядок сохраняется

9 ответов

15 просмотров

Executor может исполнять задачи в нескольких потоках, поэтому говорить о порядке их выполнения в принципе бессмысленно.

Jorik-Fat Автор вопроса
Alexey Genus 😎
Executor может исполнять задачи в нескольких поток...

если говорить про завершение таски - то это понятно, а если про начало?

Jorik-Fat Автор вопроса
Alexey Genus 😎
Executor может исполнять задачи в нескольких поток...

таска же привязывается к исполняющемуся потоку, это же не корутина

Если вопрос про экзекьютор как интерфейс, то потому что интерфейс не накладывает таких ограничений. Если про конкретную имплементацию, то обеспечивать порядок запуска дороже чем не обеспечивать, поэтому могут быть всякие более расслабленные модели. Но что до имплементации из коробки, там я действительно ожидаю блокирующую очередь, и транзитивно порядок запуска* в порядке добавления. * Порядок извлечения из очереди. Никто не мешает одному потоку достать таску из очереди и заснуть, а другому достать следующую и запустить, или по каким-либо другим причинам оказаться более прытким, чем первый поток

Jorik Fat
если говорить про завершение таски - то это понятн...

Есть executor из двух потоков. Делаем туда два раза submit без задержек. Зачем в данной ситуации задерживать начало исполнения, если можно сразу начать исполнение?

Jorik Fat
таска же привязывается к исполняющемуся потоку, эт...

Да, но разные задачи запускаются на разных потоках

Jorik-Fat Автор вопроса
Alexey Genus 😎
Есть executor из двух потоков. Делаем туда два раз...

ну так и получится, что порядок сохраняется: submit(task1) - уходит на Thread1; submit(task2) - уходит на Thread2; submit(task3) - кладется в BlockingQueue submin(task4) - так же кладется в BlockingQueue и когда Thread1 или Thread2 закончат свою работу - они возьмут именно task3 - т.е. порядок сохраняется;

Jorik Fat
ну так и получится, что порядок сохраняется: submi...

Thread 1 достал таск 3 и был поставлен на паузу шедулером ОС Thread 2 достал таск 4 и тут же запустил Thread 1 проснулся и запустил 3

Jorik-Fat Автор вопроса
Etki
Thread 1 достал таск 3 и был поставлен на паузу ше...

т.е. как бы порядок обработки сохраняется, но порядок выполнения не гарантирован?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта