Java. Multithreading. Wait and Notify methods. Blocking Queue and Worker Thread.

  Рет қаралды 18,479

Sergey Arkhipov Java Tutorials

Sergey Arkhipov Java Tutorials

Күн бұрын

Пікірлер: 29
@algsorokin
@algsorokin 2 ай бұрын
@arhitutorials, Спасибо, добрый человек) Вчера попалась такая задача на собесе, только с множеством продюсеров и консьюмеров. Но легко разрешилось добавлением того же бесконечного while в метод put и использованием notifyAll вместо notify
@ДимаДербин-с1ф
@ДимаДербин-с1ф 4 жыл бұрын
Вау. Это талант. Вы объяснили за 16 минут (+прошлое видео) то, что я не смог понять читая различные статьи несколько часов.
@PoMaH_B
@PoMaH_B 2 жыл бұрын
на 2:22 неточность. Нить, вызывая метод wait, НЕ блокируется(нить переходит в состояние BLOCKED), а ОЖИДАЕТ(нить переходит в состояние WAITING). После того как другая нить вызовет метод notify, ожидающая нить перейдет в состояние RUNNABLE и попытается захватить монитор. В случае если монитор успела захватить другая нить, то наша нить заблокируется(состояние BLOCKED)
@arhitutorials
@arhitutorials 2 жыл бұрын
Да, все так, спасибо за уточнение.
@Devivl
@Devivl Жыл бұрын
Спасибо, Сергей. Супер.
@druzzyaka
@druzzyaka 3 жыл бұрын
Прекрасний приклад і подача матеріалу. Дякую за корисне відео
@Chekist2008
@Chekist2008 4 жыл бұрын
Не уроки, а песня прямо какая-то)) Спасибо за ваш труд!
@p.polunin
@p.polunin Жыл бұрын
Спасибо большое! Повторение - мать учения!
@d.mertsalov
@d.mertsalov 5 жыл бұрын
Очень интересный пример! Спасибо!
@ИльяВологдин-б1и
@ИльяВологдин-б1и 2 жыл бұрын
Спасибо, брат. Супер полезные видосы. Удачи в прокачке канала.
@Aticinsane
@Aticinsane 5 жыл бұрын
Отлично объясняешь! Спокойно, просто и понятно. Еще бы рассказал про отличие notify() от notifyAll()
@namefamily957
@namefamily957 3 жыл бұрын
Спасибо, теперь мне понятнее как устроен handlerThread и его очередь)
@Andrzej3935
@Andrzej3935 3 жыл бұрын
Спасибо вам, сенсеэй!
@simplechannel7859
@simplechannel7859 4 жыл бұрын
Отличное видео! Буду знать альтернативу. Даже не задумывался об этом. По дефолту threadpoolexecutor для этих целей всегда юзал) Теперь буду знать альтернативу на один поток) Спасибо!
@arhitutorials
@arhitutorials 4 жыл бұрын
Это не совсем альтернатива. По смыслу это тот же executor, только написанный вручную. И потоков можно ещё добавить, если надо. В общем, если бы не было executor, то можно было бы его так реализовать.
@simplechannel7859
@simplechannel7859 4 жыл бұрын
@@arhitutorials до Ваших видео я думал я хоть немного в Java понимаю. Сейчас вижу что еще расти и расти. Я и раньше так думал, но сейчас вижу, что пропасть еще больше)
@ЮлияЮлия-в9н
@ЮлияЮлия-в9н 4 жыл бұрын
Супер. так просто о сложном
@mx1xmx
@mx1xmx 4 жыл бұрын
remove(index) елемента коллекции возвращает удалённый элемент))
@JustDux
@JustDux 2 жыл бұрын
Я правильно понимаю, что если для worker установить setDaemon(true), то main завершит свою работу после того как задачи закончатся?
@andreybursov2857
@andreybursov2857 2 жыл бұрын
Нет, нить (Thread) закончит работу, когда все основные потоки (не daemon) закончат свою работу. В данном случае когда поток main закончит работу, а это сразу после добавления заданий в Array
@maniana1987
@maniana1987 3 жыл бұрын
Я не могу сообразить, а когда происходит выполнение метода start()? Thread t1 = new Thread(printA()); Thread t2 = new Thread(printB()); Thread t3 = new Thread(printC()); for (int i = 0; i < 5; i++) { queue.put(t1); queue.put(t2); queue.put(t3); } Спасибо Сергей за Ваши уроки!
@arhitutorials
@arhitutorials 3 жыл бұрын
Метод thread.start() стартует выполнение потока. Мы может создать поток так: Thread t = new Thread(() -> { ...код, который будет исполняться потоком... }) При этом поток создается, но он еще не запущен и ничего не выполняет. если вызвать у него метод t.start() то поток t запускается, выполнение кода внутри потока начинается немедленно, а поток, который вызвал t.start() продолжает дальше по коду заниматься своими делами. Короче говоря, поток надо создать, а потом еще запустить методом start(), чтоб он что-то делал.
@maniana1987
@maniana1987 3 жыл бұрын
@@arhitutorials Спасибо за ответ. Если позволите я задам ещё вопрос. У меня три потока которые печатают каждый свою букву. А ЧТО происходит когда я эти потоки помещаю в класс очереди, в цикле? Потоки работаю синхронизированно или просто последовательно вызывается метод run? В консоли как будто синронизированно.
@arhitutorials
@arhitutorials 3 жыл бұрын
@@maniana1987 Thread имплементирует интерфейс Runnable, по этому когда потоки добавляются в очередь, у них просто вызывается метод run() как у обычного Runnable, что к запуску потока не приводит, а приводит лишь к исполнению Runnable, который передан в конструктор потока при создании. То есть потоки в коде выше как потоки не используются вообще. А просто поток, обслуживающий очередь последовательно выполнит printA, printB, printC.
@stivstivsti
@stivstivsti 4 жыл бұрын
Если после wait блокировка снята, то получается что доступ к tasks становится не защищенным с точки зрения многопоточности?
@arhitutorials
@arhitutorials 4 жыл бұрын
Очень хороший вопрос. Если поток остановился на wait, а потом другой поток вызвал notify, то поток возвращается в активное состояние. Но, мы помним, что внутри synchronized блоков может работать только один поток, удерживающий в данный момент монитор. Монитор будет у потока, который вызвал notify. По этому хоть поток, который спал на wait, и разбужен, он не может сразу начать выполнять код следующий за wait, а будет вынужден ждать, пока другой поток освободит монитор. То есть, все правила, касающиеся syncronized блоков выполняются, нарушения потокобезопасности нет. Можно себе представить, что вызывая метод wait, поток выходит из syncronized блока отпуская монитор и после notify, вынужден в него возвращаться по всем правилам работы syncronized блоков.
@andjusticeforall9473
@andjusticeforall9473 2 жыл бұрын
Спасибо! Очень доступно и в то же время без воды🔥 Не плохо было бы добавить кнопочку "спонсировать"... Один вопрос: я так понимаю здесь реализован producer - consumer. Всегда ли будет выполняться порядок добавлено-взято...добавлено-взято или могут быть ситуации, когда сначало будет несколько раз подряд добавлено, а потом несколько раз взято?
@DedVpihto
@DedVpihto 4 жыл бұрын
Ааааа, как обидно, когда нихера не понял как это работает.
@arhitutorials
@arhitutorials 4 жыл бұрын
Не стоит переживать, тема сложная, я сам когда это изучал, с первого раза не понял и со второго тоже) Так что это нормально. Надо вернуться позже к этому вопросу и снова попробовать разобраться, если будет интерес.
Java. Методы equals и hashCode.
15:05
Sergey Arkhipov Java Tutorials
Рет қаралды 40 М.
To Brawl AND BEYOND!
00:51
Brawl Stars
Рет қаралды 17 МЛН
She made herself an ear of corn from his marmalade candies🌽🌽🌽
00:38
Valja & Maxim Family
Рет қаралды 18 МЛН
“Don’t stop the chances.”
00:44
ISSEI / いっせい
Рет қаралды 62 МЛН
Многопоточность глазами разработчика
1:36:04
Java. Очередь и стек.
22:03
Sergey Arkhipov Java Tutorials
Рет қаралды 22 М.
Java. Многопоточность. Как устроить Deadlock.
14:39
Sergey Arkhipov Java Tutorials
Рет қаралды 10 М.
Project Reactor - реактивная Java
27:27
letsCode
Рет қаралды 50 М.
Многопоточность в Java: основы
1:23:05
Computer Science Center
Рет қаралды 113 М.
Java. Распараллеливаем вычисления на пуле потоков.
21:37
Thread → Task. Многопоточность и Асинхронность
13:39
Архитектор ПО. Александр Желнин
Рет қаралды 32 М.
Java. Об Iterator и Iterable c примерами.
16:20
Sergey Arkhipov Java Tutorials
Рет қаралды 25 М.
To Brawl AND BEYOND!
00:51
Brawl Stars
Рет қаралды 17 МЛН