InterruptedException
Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.
Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки
#java #lesson #multithreading
Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.
Thread.stop()
это устаревший метод, который просто убивал поток. Сейчас есть Thread.interrupt()
который говорит, что потоку надо закончить работу.Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки
!Thread.currentThread().isInterrupted()
.#java #lesson #multithreading
Создание потока
Для этого вам нужно создать новый класс и унаследовать его от класса Thread или от интерфейса Runnable.
Первый вариант не очень, поскольку нарушает принцип SOLID и добавляет в иерархию классов Thread.
Поэтому лучше всего использовать Runnable. К тому же, его можно определять как лямбду, как на фото выше.
#java #lesson #multithreading
Для этого вам нужно создать новый класс и унаследовать его от класса Thread или от интерфейса Runnable.
Первый вариант не очень, поскольку нарушает принцип SOLID и добавляет в иерархию классов Thread.
Поэтому лучше всего использовать Runnable. К тому же, его можно определять как лямбду, как на фото выше.
#java #lesson #multithreading
Синхронизация потоков
Потоки, как ни крути, работают с памятью и бывает такое, что два потока могут одновременно обратится и/или изменить один и тот же объект.
Это может привести к ошибке согласованности памяти. Самое простое решение — использовать synchronized.
#java #lesson #multithreading
Потоки, как ни крути, работают с памятью и бывает такое, что два потока могут одновременно обратится и/или изменить один и тот же объект.
Это может привести к ошибке согласованности памяти. Самое простое решение — использовать synchronized.
#java #lesson #multithreading
Жизненный цикл потока
Поток в процессе жизни меняет свой статус. Как только он создан, поток обретает статус NEW.
После того, как мы вызывали
Когда поток жив, но не активен, то статус или BLOCKED (из-за synchonized), или WAITING (
Если поток больше не выполняется (завершился успешно или с ошибкой), то получает TERMINATED.
Узнать состояние потока сейчас можно с
#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
Или голодание. В таком случае потоки не заблокированы, но при этом не выполняют работу. Им просто не хватает ресурсов.
Поэтому пока одни потоки на себя берут всё время выполнения, другие не могут выполниться. Есть очень хороший пример.
#java #lesson #multithreading
Синхронизация потоков
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
Синхронизация потоков
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading
Пока один поток изменяет значение, а второй его считывает, они оба могут получить две абсолютно разные величины. Это может привести к ошибке согласованности памяти.
Простое решение — использовать synchronized. Он приостанавливает один поток, пока второй работает с ячейкой памяти.
📌 Объяснение от Oracle
#java #lesson #multithreading