Тестовое задание Сбер Java Многопоточность

  Рет қаралды 7,616

Петр Арсентьев

Петр Арсентьев

Күн бұрын

В этом видео я разбираю решение тестового задания по многопоточности из компании Сбер.
Стань программистом с www.job4j.ru

Пікірлер: 35
@job4j
@job4j Жыл бұрын
В этом видео я разбираю решение тестового задания по многопоточности из компании Сбер. Стань программистом с www.job4j.ru
@Max-wn2gd
@Max-wn2gd Жыл бұрын
А это на какую позицию? Джун, мидл ?
@voynere
@voynere Жыл бұрын
​@@Max-wn2gdмногопоточность уже на Джуна требуют)
@job4j
@job4j Жыл бұрын
Думаю, что мидл. От джунов требуют ООП, Коллекции, SQL. А тут все же уже тонкости.
@Max-wn2gd
@Max-wn2gd Жыл бұрын
@@voynere ну когда я например собесился на джуна, то вопросы (не текстовые) по многопоточке были в некоторых компаниях. Это был 20 год. Да и Джуну всё-таки хорошо бы хоть какую-то базу по этому иметь
@mib-1
@mib-1 Жыл бұрын
хм ... нельзя ссылку на git вставить, коммент удаляется. Небольшой код на основе SynchronousQueue, позволяет добавлять любое количество потоков, выполняющихся по схеме 1,2,3,1,2,3,...
@job4j
@job4j Жыл бұрын
Пришли в телеграмм @parsentev
@rafonvc6267
@rafonvc6267 25 күн бұрын
Это тестовое задание на джуна или выше?
@job4j
@job4j 25 күн бұрын
А они его всем дают.
@НикитаПосмак
@НикитаПосмак 5 ай бұрын
а зачем в первом примере в конце join() если он уже в лябде вызова потока? а во второй задаче можно просто преключаться через Semaphore.aquire() / release()
@yeldarnuralin7856
@yeldarnuralin7856 9 ай бұрын
Привет Петр, спасибо. Я попробовал сделать через 2 BlockingQueue, в который один пишет, а другой ждет. Есть еще задачки? ))
@_bigbro
@_bigbro 3 ай бұрын
например, порнохаб ввел защиту от скачивания файлов и теперь передает m3u8 файлы, который содержит ссылку на segment файл. задача - собрать исходный ролик, путем объединения всех сегментов в mp4 файл. ограничения скорость интернета 100кб, у процессора 2 ядра, оперативная память 2Гб. размер сегмента 8кб, а скорость декодировки одного сегмента 20мс.
@МихаилМенчинев
@МихаилМенчинев 10 ай бұрын
нужна ссылка на проект, иначе трудно воспринимать
@divergenny
@divergenny Жыл бұрын
спасибо большое
@kivoradba
@kivoradba 2 ай бұрын
И где ж в Сбере такие задания дают?
@job4j
@job4j 2 ай бұрын
Это сберподстава, чтобы больше просмотров было. В сбер берут всех, только скажи что программист )).
@alexandr7686
@alexandr7686 Жыл бұрын
почему бы не рассмотреть CyclicBarrier, а вы точно уверены что не volatile флаги всегда будут отрабатывать как надо в syncronized? Может лучше сделать их AtomicBoolean или volatile?
@Max-wn2gd
@Max-wn2gd Жыл бұрын
Переменные в синхронайзд блоке будут ок отрабатывать т.к. такого рода блоки подчиняются правилу "happens before".
@job4j
@job4j Жыл бұрын
Попробуйте тоже решить ее. Я посмотрю ваше решение. Давайте вместе.
@alexandr7686
@alexandr7686 Жыл бұрын
@@Max-wn2gd synchronized гарантирует лок но не гарантирует защиту от реордеринга, если я не ошибаюсь. Поэтому нужен volatile
@Max-wn2gd
@Max-wn2gd Жыл бұрын
@@alexandr7686 а в чем проблема реордеринга ? Просто нужно правильно синхронизировать тот код, кот-ый будет выполняется многими потоками и всё будет ок, т.к. все эти реордеринги будут не видны в других потоках. Если эффект реордеринга виден в другом потоке, то значит, что код некорректно синхронизован
@aZaZloKeR
@aZaZloKeR 5 ай бұрын
Как то в первой всё усложнено, можно проще: Thread third = new Thread( () -> foo.third() ); Thread second = new Thread( () -> foo.second() ); Thread first = new Thread( () -> foo.first() ); third.start(); third.join(); second.start(); second.join(); first.start(); first.join();
@foxesfox5870
@foxesfox5870 2 ай бұрын
😂 А где тут многопоточность?
@alexnikol6966
@alexnikol6966 5 ай бұрын
AtomicBoolean bFirst = new AtomicBoolean(true); ... var first = new Thread(() -> { int count = 1; while (count { int count = 1; while (count
@job4j
@job4j 5 ай бұрын
Возможный вариант, но yield же не гарантирует, что нить переключит контекст.
@alexnikol6966
@alexnikol6966 5 ай бұрын
@@job4j пропустит другую. Можно sleep(10) тоже работает
@awdawdawdawdaw-hs7kv
@awdawdawdawdaw-hs7kv 2 ай бұрын
package org.example; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; public class Main { public static void main(String[] args) throws InterruptedException { temp temp = new temp(); CountDownLatch countDownLatch = new CountDownLatch(2938747); CountDownLatch countDownLatch2 = new CountDownLatch(1); var t1 = new Thread(() -> { synchronized (temp) { countDownLatch2.countDown(); temp.q1("first"); countDownLatch.countDown(); temp.waitqwe(temp); temp.doSomeWith1Thread("first", countDownLatch, temp); if(countDownLatch.getCount() % 2 != 0) { temp.q1("first"); countDownLatch.countDown(); temp.notify(); } } }); var t2 = new Thread(() -> { asdwaitlatch2(countDownLatch2); synchronized (temp) { temp.doSomeWith2Thread("double", countDownLatch, temp); temp.doSomeWith2Thread("double", countDownLatch, temp); if(countDownLatch.getCount() % 2 == 0) { temp.q1("double"); } } }); t1.start(); t2.start(); t1.join(); t2.join(); temp.asd.forEach(System.out::println); } static void asdwaitlatch2(CountDownLatch countDownLatch2) { try { countDownLatch2.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } } class temp { List asd = new CopyOnWriteArrayList(); void q1(String qwe) { asd.add(qwe); } void doSomeWith1Thread(String name, CountDownLatch countDownLatch, temp temp) { if(countDownLatch.getCount() % 2 != 0) { temp.q1(name); countDownLatch.countDown(); temp.notify(); temp.waitqwe(temp); } } void doSomeWith2Thread(String name, CountDownLatch countDownLatch, temp temp) { if(countDownLatch.getCount() % 2 == 0) { temp.q1(name); countDownLatch.countDown(); temp.notify(); temp.waitqwe(temp); } } void waitqwe(temp temp) { try { temp.wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } } }
@awdawdawdawdaw-hs7kv
@awdawdawdawdaw-hs7kv 2 ай бұрын
думаю даже первый летч излишний, можно просто AtomicInteger count в temp поставить
@awdawdawdawdaw-hs7kv
@awdawdawdawdaw-hs7kv 2 ай бұрын
package org.example; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; public class Main { public static void main(String[] args) throws InterruptedException { temp temp = new temp(); CountDownLatch countDownLatch2 = new CountDownLatch(1); var t1 = new Thread(() -> { synchronized (temp) { countDownLatch2.countDown(); temp.q1("first"); temp.count.incrementAndGet(); temp.waitqwe(temp); temp.doSomeWith1Thread("first", temp.count, temp); if(temp.count.get() % 2 != 0) { temp.q1("first"); temp.count.incrementAndGet(); temp.notify(); } } }); var t2 = new Thread(() -> { asdwaitlatch2(countDownLatch2); synchronized (temp) { temp.doSomeWith2Thread("double", temp.count, temp); temp.doSomeWith2Thread("double", temp.count, temp); if(temp.count.get() % 2 == 0) { temp.q1("double"); } } }); t1.start(); t2.start(); t1.join(); t2.join(); temp.asd.forEach(System.out::println); } static void asdwaitlatch2(CountDownLatch countDownLatch2) { try { countDownLatch2.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } } class temp { List asd = new CopyOnWriteArrayList(); AtomicInteger count = new AtomicInteger(2938747); void q1(String qwe) { asd.add(qwe); } void doSomeWith1Thread(String name, AtomicInteger countDownLatch, temp temp) { if(countDownLatch.get() % 2 != 0) { temp.q1(name); countDownLatch.decrementAndGet(); temp.notify(); temp.waitqwe(temp); } } void doSomeWith2Thread(String name, AtomicInteger countDownLatch, temp temp) { if(countDownLatch.get() % 2 == 0) { temp.q1(name); countDownLatch.decrementAndGet(); temp.notify(); temp.waitqwe(temp); } } void waitqwe(temp temp) { try { temp.wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } } }
@awdawdawdawdaw-hs7kv
@awdawdawdawdaw-hs7kv 2 ай бұрын
package org.example; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; public class Main { public static void main(String[] args) throws InterruptedException { List futures = new ArrayList(); temp temp = new temp(); for (int i = 0; i < 11; i++) { if (i % 2 == 0) { futures.add(CompletableFuture.supplyAsync(() -> "first")); } else { futures.add(CompletableFuture.supplyAsync(() -> "second")); } } futures.forEach(completableFuture -> { try { completableFuture.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { throw new RuntimeException(e); } }); futures.forEach(e -> { try { temp.asd.add(e.get()); } catch (InterruptedException ex) { throw new RuntimeException(ex); } catch (ExecutionException ex) { throw new RuntimeException(ex); } }); temp.asd.forEach(System.out::println); } } class temp { List asd = new CopyOnWriteArrayList(); } ну или вообще вот так сделать
@job4j
@job4j 2 ай бұрын
Спасибо. Попросите GPT теперь решить и сравните со своим решение.
@awdawdawdawdaw-hs7kv
@awdawdawdawdaw-hs7kv 2 ай бұрын
@@job4j зачем? он скинул костыли с Thread.sleep
Тестовое задание Java Kotlin - SQL Parser
16:47
Петр Арсентьев
Рет қаралды 1,2 М.
OYUNCAK MİKROFON İLE TRAFİK LAMBASINI DEĞİŞTİRDİ 😱
00:17
Melih Taşçı
Рет қаралды 12 МЛН
From Small To Giant Pop Corn #katebrush #funny #shorts
00:17
Kate Brush
Рет қаралды 71 МЛН
The Joker wanted to stand at the front, but unexpectedly was beaten up by Officer Rabbit
00:12
Players vs Corner Flags 🤯
00:28
LE FOOT EN VIDÉO
Рет қаралды 80 МЛН
Лекция 11. Многопоточность в Java
1:42:36
Computer Science Center
Рет қаралды 37 М.
Как GPT влияет на рынок IT
8:48
Петр Арсентьев
Рет қаралды 3,2 М.
Многопоточность глазами разработчика
1:36:04
САРАЙ-АКВАРИУМ В ИПОТЕКУ / СТРОЙХЛАМ
23:35
СтройХлам
Рет қаралды 178 М.
Вопросы с senior java интервью [3/3]
33:59
Kirill Grishchuk - Software Engineer
Рет қаралды 12 М.
Рынок IT в 2024 Рисуем опыт работы Middle+++
11:47
Петр Арсентьев
Рет қаралды 6 М.
OYUNCAK MİKROFON İLE TRAFİK LAMBASINI DEĞİŞTİRDİ 😱
00:17
Melih Taşçı
Рет қаралды 12 МЛН