Java — многопоточность
Java – это многопоточный язык программирования. что означает, что мы можем разработать многопоточную программу с использованием Java. Многопоточная программа состоит из двух или более частей, которые могут выполняться одновременно, и каждая часть может одновременно выполнять разные задачи, оптимально используя доступные ресурсы, особенно когда на вашем компьютере установлено несколько процессоров.
По определению, многозадачность — это когда несколько процессов совместно используют общие вычислительные ресурсы, такие как ЦП. Многопоточность распространяет идею многозадачности на приложения, где вы можете разделить определенные операции в одном приложении на отдельные потоки. Каждый из потоков может работать параллельно. ОС распределяет время обработки не только между разными приложениями, но и между каждым потоком внутри приложения.
Многопоточность позволяет писать таким образом, чтобы в одной и той же программе одновременно выполнялись несколько действий.
Жизненный цикл потока
Нить проходит через различные этапы своего жизненного цикла. Например, поток рождается, запускается, выполняется и затем умирает. На следующей диаграмме показан полный жизненный цикл потока.
Ниже приведены этапы жизненного цикла —
-
Новое − Новый поток начинает свой жизненный цикл в новом состоянии. Он остается в этом состоянии до тех пор, пока программа не запустит поток. Его также называют рожденной нитью. .
-
Запускаемый − После запуска вновь созданного потока этот поток становится работоспособным. Поток в этом состоянии считается выполняющим свою задачу.
-
Ожидание − Иногда поток переходит в состояние ожидания, в то время как поток ожидает выполнения задачи другим потоком. Поток переходит обратно в рабочее состояние только тогда, когда другой поток сигнализирует ожидающему потоку о продолжении выполнения.
-
Ожидание по времени − Готовый к выполнению поток может войти в состояние ожидания по времени на указанный интервал времени. Поток в этом состоянии переходит обратно в рабочее состояние, когда этот интервал времени истекает или когда происходит событие, которого он ожидает.
-
Удален (мертв) − Готовый к выполнению поток переходит в состояние завершения, когда он завершает свою задачу или завершается иным образом.
Приоритеты потоков
Каждый поток Java имеет приоритет, который помогает операционной системе определять порядок, в котором запланированы потоки.
Приоритеты потоков Java находятся в диапазоне от MIN_PRIORITY (константа 1) до MAX_PRIORITY (константа 10). По умолчанию каждому потоку назначается приоритет NORM_PRIORITY (константа 5).
Потоки с более высоким приоритетом более важны для программы, и процессорное время должно выделяться перед потоками с более низким приоритетом. Однако приоритеты потоков не могут гарантировать порядок выполнения потоков и очень сильно зависят от платформы.
Создание потока путем реализации запускаемого интерфейса
Если ваш класс предназначен для выполнения в виде потока, вы можете добиться этого, реализуя Runnable интерфейс. Вам нужно будет выполнить три основных шага —
Шаг 1
В качестве первого шага вам необходимо реализовать метод run(), предоставляемый Runnable. интерфейс. Этот метод обеспечивает точку входа для потока, и вы поместите всю свою бизнес-логику в этот метод. Ниже приведен простой синтаксис метода run() —
09
Шаг 2
На втором этапе вы создадите экземпляр потока. объект, используя следующий конструктор —
18
Где threadObj является экземпляром класса, который реализует Runnable интерфейс и threadName имя, присвоенное новому потоку.
Шаг 3
После создания объекта Thread его можно запустить, вызвав start(). метод, который выполняет вызов метода run(). Ниже приведен простой синтаксис метода start () —
26
Пример
Вот пример, который создает новый поток и запускает его —
Живая демонстрация30
Это даст следующий результат —
Вывод
48
Создать поток, расширив класс потока
Второй способ создать поток — создать новый класс, расширяющий Thread. class, используя следующие два простых шага. Такой подход обеспечивает большую гибкость при обработке нескольких потоков, созданных с использованием доступных методов класса Thread.
Шаг 1
Вам нужно будет переопределить run() метод, доступный в классе Thread. Этот метод обеспечивает точку входа для потока, и вы поместите всю свою бизнес-логику в этот метод. Ниже приведен простой синтаксис метода run() —
56
Шаг 2
Как только объект Thread создан, вы можете запустить его, вызвав start() метод, который выполняет вызов метода run(). Ниже приведен простой синтаксис метода start () —
69
Пример
Вот предыдущая программа, переписанная для расширения потока —
Живая демонстрация71
Это даст следующий результат —
Вывод
88
Методы потока
Ниже приведен список важных методов, доступных в классе Thread.
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>|
6 | <тд>|
7 | <тд>|
8 | <тд>
Предыдущие методы вызываются для конкретного объекта Thread. Следующие методы в классе Thread являются статическими. Вызов одного из статических методов выполняет операцию над текущим потоком.
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>
Пример
Следующая программа ThreadClassDemo демонстрирует некоторые из этих методов класса Thread. Рассмотрим класс DisplayMessage. который реализует Runnable −
98
Ниже приведен еще один класс, который расширяет класс Thread —
105пре>Ниже приведена основная программа, в которой используются определенные выше классы —
113Это даст следующий результат. Вы можете повторять этот пример снова и снова, и каждый раз вы будете получать новый результат.
Вывод
128Основные концепции многопоточности в Java
При программировании многопоточности на Java вам понадобятся следующие концепции:
-
Что такое синхронизация потоков?
-
Обработка межпотокового взаимодействия
-
Обработка взаимоблокировки потока
-
Основные операции с потоками
java