Многопоточность В Java

Привет! В этой статье я кратко познакомлю вас с процессами, потоками и основами многопоточного программирования на Java.

Многопоточность в Java

Наиболее очевидным применением многопоточности является программирование интерфейсов.

Многопоточность необходима, если вы хотите, чтобы графический интерфейс продолжал реагировать на ввод пользователя во время выполнения некоторой обработки.

Например, поток, отвечающий за интерфейс, может дождаться завершения загрузки файла из Интернета другим потоком и в это время отобразить какую-нибудь анимацию или обновить индикатор выполнения.

Кроме того, он может остановить загрузку файла потоком, если была нажата кнопка «Отмена».

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

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

Давайте начнем.

Сначала о процессах.



Процессы

Процесс — это набор кода и данных, разделяющих общее виртуальное адресное пространство.

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

Процессы изолированы друг от друга, поэтому прямой доступ к памяти другого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств).

Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ.

Это пространство принадлежит процессу, содержит только его данные и полностью находится в его распоряжении.

Операционная система отвечает за то, как виртуальное пространство процесса отображается в физическую память.

Схема этого взаимодействия представлена на рисунке.

Операционная система оперирует так называемыми страницами памяти, которые представляют собой просто область определенного фиксированного размера.

Если процессу не хватает памяти, система выделяет ему дополнительные страницы из физической памяти.

Страницы виртуальной памяти могут быть сопоставлены с физической памятью в любом порядке.



Многопоточность в Java

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



Потоки

Один поток — это одна единица выполнения кода.

Каждый поток последовательно выполняет инструкции процесса, которому он принадлежит, параллельно с другими потоками этого процесса.

Фразу «параллельно с другими потоками» следует обсудить отдельно.

Известно, что в любой момент времени на каждое ядро процессора приходится один исполнительный блок.

То есть одноядерный процессор может обрабатывать команды только последовательно, по одной (в упрощенном случае).

Однако запуск нескольких параллельных потоков также возможен в системах с одноядерными процессорами.

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

Эта схема называется псевдопараллелизмом.

Система запоминает состояние (контекст) каждого потока перед переключением на другой поток и восстанавливает его, когда поток возвращается к выполнению.

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

Вот как это выглядит:

Многопоточность в Java

Цветные квадраты на рисунке — инструкции процессора (зелёные — инструкции основного потока, синие — инструкции бокового потока).

Исполнение идет слева направо.

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

Количество инструкций, выполняемых для каждого подхода, не определено.

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

Следующая статья будет посвящена проблемам взаимодействия потоков, а пока поговорим о том, как запускаются потоки в Java.

Запуск потоков

Каждый процесс имеет хотя бы один работающий поток.

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

В Java после создания процесса выполнение основного потока начинается с метода main().

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

В Java поток представлен как объект-потомок класса Thread. Этот класс инкапсулирует стандартные механизмы потоковой обработки.

Создать новую тему можно двумя способами: Способ 1 Создайте объект класса Thread, передав ему в конструктор что-то, реализующее интерфейс Runnable. Этот интерфейс содержит метод run(), который будет выполнен в новом потоке.

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

Это выглядит так:

   

class SomeThing

Теги: #java #многопоточное программирование #программирование #java #Параллельное программирование
Вместе с данным постом часто просматривают: