ПУТЕШЕСТВИЕ ПО РАЗРАБОТКЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Java-разработчикам необходимо знать эти концепции потоков

Как начать работу с потоками в Java

Обзор

В программировании на Java поток — самый популярный метод программирования параллелизма и параллелизма. С точки зрения технической концепции Java, Thread помогает нам достичь параллелизма в программе Java, ускоряет работу приложения, особенно выполнение нескольких задач одновременно. В этой статье я поделюсь с вами подходом к программированию Thread In Java с помощью краткой теории и примеров, которые помогут вам понять.

Почему нить важна

Есть четыре причины использования Thread:

  • Для более быстрой обработки фоновых/пакетных задач: когда несколько задач должны выполняться одновременно, многопоточность позволяет выполнять разные задачи параллельно. В результате сокращается общее время обработки.
  • Чтобы в полной мере использовать мощность ЦП: большинство современных ЦП имеют несколько процессоров, и каждый процессор имеет несколько ядер. Многопоточность позволяет запускать разные потоки на разных процессорах, что позволяет более эффективно использовать системные ресурсы.
  • Для сокращения времени отклика: мы также можем использовать несколько потоков, чтобы сократить время отклика, выполняя быстрые вычисления, разделяя большую задачу на более мелкие фрагменты и обрабатывая их с использованием нескольких потоков.
  • Одновременное обслуживание нескольких пользователей. Представьте, что у вас есть многопоточный сервер. Это означает, что несколько пользователей могут одновременно подключаться к серверу. Например, есть много пользователей, которые отправляют запросы на сервер одновременно, поэтому на многопоточном сервере каждому пользователю не нужно ждать, пока приложение завершит обработку запроса предыдущего пользователя, потому что они самостоятельная обработка, не зависящая друг от друга.

Жизненный цикл потока

Жизненный цикл нити — это состояние трансформации, когда нить начинается с ее рождения и заканчивается ее смертью. Когда новый экземпляр потока создается и выполняется путем вызова метода start() класса Thread, поток переходит в состояние готовности к выполнению. Когда вызываются методы sleep() или wait() класса Thread, поток переходит в нерабочий режим. Поток умирает, когда он выходит из процесса run().

В основном есть этапы жизненного цикла, см. Ниже:

Новый: когда создается новый поток, он начинает свой жизненный цикл в новом состоянии.

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

Заблокировано/Ожидает. Когда поток временно неактивен, он находится в одном из следующих состояний: Заблокирован/Ожидает.

Ожидание по времени. Поток в состоянии ожидания по времени при вызове метода с параметром времени ожидания ожидает завершения времени ожидания. Например, когда поток вызывает метод sleep(), он переходит в состояние ожидания по времени.

Завершить (мертвый): поток в состоянии завершения, когда его метод run() завершает выполнение инструкций. Поток также может быть мертв, когда вызывается метод stop().

Использование класса потока

Java предоставляет класс Thread для реализации программирования, который предоставляет конструкторы и методы для создания и выполнения операций в потоке.

Пример кода для создания Thread с помощью конструкторов Thread:

Нить():

В этом примере не указан код для выполнения потока.

Тема (исполняемая r):

Вывод:

Работающий

Расширение класса потока

Таким образом, поток создается новым классом, который расширяет класс Thread. Класс переопределит метод run(), содержащий функции, которые должны быть реализованы потоком.

Ниже приведен пример создания потока путем расширения класса Thread:

Вывод:

Поток запущен

Выше метод start() используется для создания нового потока и его запуска. Новый поток начинается внутри метода void run().

Реализовать работающий интерфейс

Еще один способ реализовать многопоточность в Java — создать класс, реализующий интерфейс Runnable. Интерфейс Runnable — это стандартный интерфейс Java, который поставляется вместе с платформой Java. Интерфейс Runnable имеет только один метод run(). Мы должны написать код внутри метода run() для выполнения потока.

Вот пример:

Метод start() используется для вызова метода run(). При вызове start() потоку передается новый стек, и вызывается метод run() для введения нового потока в программу.

Приоритеты потоков

В Java у каждого потока есть приоритет. Приоритеты представлены числом от 1 до 10. Планировщик потоков планирует потоки в соответствии с их приоритетом, чтобы определить, какой из них должен быть разрешен для выполнения.

В классе Thread определены три константы приоритетов:

  • Тема.MIN_PRIORITY
  • Тема.NORM_PRIORITY
  • Тема.MAX_PRIORITY

NORM_PRIORITY — приоритет потока по умолчанию равен 5. Остальные MIN_PRIORITY и MAX_PRIORITY со значениями 1 и 10 соответственно.

Пример приоритета потока:

Вывод:

Приоритет потока Thread-1

Приоритет потока Thread-2

Приоритет потока Thread-0

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

Но если есть два потока с одинаковым приоритетом, то нельзя предсказать, какой поток получит предпочтение для выполнения первым. Затем выполнение зависит от алгоритма планировщика потоков (первым пришел, первым обслужен и т. д.).

Пример:

Вывод:

Приоритет потока Thread-2

Приоритет потока Thread-0

Приоритет потока Thread-1

Обычно используемые методы в потоке

В классе Thread так много часто используемых методов, которые проиллюстрированы следующим образом:

Синхронизация в потоке

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

Например, есть три потока: A и B, которые выполняются одновременно и нуждаются в доступе к критическому ресурсу C. Чтобы избежать конфликта при доступе к C, потоки A и B должны быть синхронизированы. Таким образом, когда A обращается к C, а B также пытается получить доступ к C, доступ B к C должен быть предотвращен с помощью конфликта до тех пор, пока A не завершит свою работу и не выйдет из C.

Java предоставляет способ создания потоков и синхронизации их задач с использованием синхронизированных блоков. Синхронизированные блоки в Java помечаются ключевым словом synchronized.

Используются две стратегии синхронизации:

Синхронный метод:

Он как бы использует ключевое слово synchronized в своем объявлении. Когда поток вызывает синхронизированный метод, синхронизированный метод автоматически получает блокировку для этого метода и освобождает ее, когда метод возвращается или завершает работу.

Пример:

Вывод:

Синхронизированное заявление:

Объявляет блок кода для синхронизации. Синхронизированный блок в Java синхронизируется с некоторыми объектами. Все другие потоки, пытающиеся ввести синхронизированный оператор, блокируются до тех пор, пока поток внутри синхронизированного оператора не выйдет из блока.

Пример:

Вывод:

Заключение

Поток в Java — важная часть, которую должен знать каждый разработчик Java. Это очень полезно для эффективной разработки программы, в которой несколько задач обрабатываются одновременно и в полной мере используется мощность ЦП. Эта статья рассказывает нам о концепциях Thread в Java и о том, как они реализованы. Я надеюсь, что эта статья поможет вам легче понять Thread в Java.

Рекомендации