Java Portal | Программирование
11.3K subscribers
800 photos
59 videos
19 files
593 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
InterruptedException

Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.

Thread.stop() это устаревший метод, который просто убивал поток. Сейчас есть Thread.interrupt() который говорит, что потоку надо закончить работу.

Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки !Thread.currentThread().isInterrupted().

#java #lesson #multithreading
Создание потока

Для этого вам нужно создать новый класс и унаследовать его от класса Thread или от интерфейса Runnable.

Первый вариант не очень, поскольку нарушает принцип SOLID и добавляет в иерархию классов Thread.

Поэтому лучше всего использовать Runnable. К тому же, его можно определять как лямбду, как на фото выше.

#java #lesson #multithreading
Синхронизация потоков

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

Это может привести к ошибке согласованности памяти. Самое простое решение — использовать synchronized.

#java #lesson #multithreading
Жизненный цикл потока

Поток в процессе жизни меняет свой статус. Как только он создан, поток обретает статус NEW.

После того, как мы вызывали thread.start(), он обретает состояние RUNNABLE.

Когда поток жив, но не активен, то статус или BLOCKED (из-за synchonized), или WAITING (Thread.join()), или TIMED_WAITING (thread.sleep()).

Если поток больше не выполняется (завершился успешно или с ошибкой), то получает TERMINATED.

Узнать состояние потока сейчас можно с thread.getState().

#java #lesson #multithreading
Проблемы многопоточности: Starvation

Или голодание. В таком случае потоки не заблокированы, но при этом не выполняют работу. Им просто не хватает ресурсов.

Поэтому пока одни потоки на себя берут всё время выполнения, другие не могут выполниться. Есть очень хороший пример.

#java #lesson #multithreading
Синхронизация потоков

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

Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.

📌 Объяснение от Oracle

#java #lesson #multithreading
Синхронизация потоков

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

Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.

📌 Объяснение от Oracle

#java #lesson #multithreading