@@voynere ну когда я например собесился на джуна, то вопросы (не текстовые) по многопоточке были в некоторых компаниях. Это был 20 год. Да и Джуну всё-таки хорошо бы хоть какую-то базу по этому иметь
хм ... нельзя ссылку на git вставить, коммент удаляется. Небольшой код на основе SynchronousQueue, позволяет добавлять любое количество потоков, выполняющихся по схеме 1,2,3,1,2,3,...
например, порнохаб ввел защиту от скачивания файлов и теперь передает m3u8 файлы, который содержит ссылку на segment файл. задача - собрать исходный ролик, путем объединения всех сегментов в mp4 файл. ограничения скорость интернета 100кб, у процессора 2 ядра, оперативная память 2Гб. размер сегмента 8кб, а скорость декодировки одного сегмента 20мс.
а зачем в первом примере в конце join() если он уже в лябде вызова потока? а во второй задаче можно просто преключаться через Semaphore.aquire() / release()
почему бы не рассмотреть CyclicBarrier, а вы точно уверены что не volatile флаги всегда будут отрабатывать как надо в syncronized? Может лучше сделать их AtomicBoolean или volatile?
@@alexandr7686 а в чем проблема реордеринга ? Просто нужно правильно синхронизировать тот код, кот-ый будет выполняется многими потоками и всё будет ок, т.к. все эти реордеринги будут не видны в других потоках. Если эффект реордеринга виден в другом потоке, то значит, что код некорректно синхронизован
Как то в первой всё усложнено, можно проще: 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();
спасибо большое
В этом видео я разбираю решение тестового задания по многопоточности из компании Сбер.
Стань программистом с www.job4j.ru
А это на какую позицию? Джун, мидл ?
@@Max-wn2gdмногопоточность уже на Джуна требуют)
Думаю, что мидл. От джунов требуют ООП, Коллекции, SQL. А тут все же уже тонкости.
@@voynere ну когда я например собесился на джуна, то вопросы (не текстовые) по многопоточке были в некоторых компаниях. Это был 20 год. Да и Джуну всё-таки хорошо бы хоть какую-то базу по этому иметь
хм ... нельзя ссылку на git вставить, коммент удаляется. Небольшой код на основе SynchronousQueue, позволяет добавлять любое количество потоков, выполняющихся по схеме 1,2,3,1,2,3,...
Пришли в телеграмм @parsentev
нужна ссылка на проект, иначе трудно воспринимать
Привет Петр, спасибо. Я попробовал сделать через 2 BlockingQueue, в который один пишет, а другой ждет. Есть еще задачки? ))
например, порнохаб ввел защиту от скачивания файлов и теперь передает m3u8 файлы, который содержит ссылку на segment файл. задача - собрать исходный ролик, путем объединения всех сегментов в mp4 файл.
ограничения скорость интернета 100кб, у процессора 2 ядра, оперативная память 2Гб. размер сегмента 8кб, а скорость декодировки одного сегмента 20мс.
а зачем в первом примере в конце join() если он уже в лябде вызова потока? а во второй задаче можно просто преключаться через Semaphore.aquire() / release()
почему бы не рассмотреть CyclicBarrier, а вы точно уверены что не volatile флаги всегда будут отрабатывать как надо в syncronized? Может лучше сделать их AtomicBoolean или volatile?
Переменные в синхронайзд блоке будут ок отрабатывать т.к. такого рода блоки подчиняются правилу "happens before".
Попробуйте тоже решить ее. Я посмотрю ваше решение. Давайте вместе.
@@Max-wn2gd synchronized гарантирует лок но не гарантирует защиту от реордеринга, если я не ошибаюсь. Поэтому нужен volatile
@@alexandr7686 а в чем проблема реордеринга ? Просто нужно правильно синхронизировать тот код, кот-ый будет выполняется многими потоками и всё будет ок, т.к. все эти реордеринги будут не видны в других потоках. Если эффект реордеринга виден в другом потоке, то значит, что код некорректно синхронизован
AtomicBoolean bFirst = new AtomicBoolean(true);
...
var first = new Thread(() -> {
int count = 1;
while (count {
int count = 1;
while (count
Возможный вариант, но yield же не гарантирует, что нить переключит контекст.
@@job4j пропустит другую. Можно sleep(10) тоже работает
Как то в первой всё усложнено, можно проще: 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();
😂
А где тут многопоточность?