JavaScript

Многопоточность Java: определение, пулы, функции и особенности

Lorem ipsum dolor

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

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

Многопоточность Java и других языков стала активно применяться примерно в начале 2000-х. В это время стали появляться многоядерные компьютеры, которые управлялись тремя известными операционными системами: Windows, Linux, MacOS. Таким образом, у программистов появилась возможность распределять работу программы на несколько ядер. Причем распределение работы происходит в параллельном режиме, благодаря чему появилась такая модель программирования, как «параллельное программирование».

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

На самом деле, многопоточность Java — это сложная тема со множеством нюансов и тонкостей. Сегодня мы лишь приоткроем занавес в мир многопоточности и параллельного программирования, поэтому начнем с азов.

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

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

Что такое поток и многопоточность Java

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

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

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

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

Многопоточность Java и многопоточность ядра компьютера

Не нужно путать многопоточность Java и многопоточность ядра. Многопоточность Java — это особенность языка, которая позволяет реализовать параллельное исполнение программы. А многопоточность ядра — это способность ядра обрабатывать программу в несколько потоков.

Чуть выше мы писали, что многопоточность бессмысленна в одноядерном компьютере. Это утверждение верно, если одно ядро компьютера поддерживает выполнение одного потока инструкций. В этом случае все инструкции «выстраиваются» в очередь и выполняются в порядке очереди или приоритетности. 

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

Например, компьютер имеет 2 ядра, а каждое из ядер имеет по 4 потока. Таким образом, двухядерный компьютер может обработать 8 потоков инструкций. Однако не нужно путать количество ядер и количество потоков в ядре. Двухядерный компьютер с 8-ю потоками будет работать менее производительней, чем 8-ядерный компьютер с одним потоком в ядре.

Многопоточность Java и пул потоков

Многопоточность Java помогает ускорить работу программ за счет того, что программа исполняется параллельно. Однако, когда программа относительно небольшая, тогда управлять потоками несложно. Но что делать, когда программа на Java становится реально большой и с огромным количеством потоков? Управлять потоками в такой программе довольно сложно, поэтому был придуман пул потоков в Java.

Пул потоков Java — это своего рода «контейнер» для потоков. Потоки в одном пуле могут выполнять разные задачи, но вся прелесть в том, что управление происходит пулом, а не потоками, то есть в исполнение запускается пул потоков. Таким образом, потоки в пуле самостоятельно выстраиваются в очередь, и после исполнения одного потока следующий начинает исполняться самостоятельно.

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

Заключение

Многопоточность Java — это не веяние программистской моды, а возможность разрабатывать более эффективные программы. Большинство современных устройств многоядерные или многопоточные. В многоядерном устройстве запускать однопоточную программу — это неэффективное использование ресурсов устройства. Если устройство способно выполнять программу в несколько потоков, тогда почему не воспользоваться такой возможностью?

Схожие статьи

Как осуществить движение объектов в Javascript: инструкция с примерами
JavaScript

Как осуществить движение объектов в Javascript: инструкция с примерами

Учебный курс по React, часть 10: практикум по работе со свойствами компонентов и стилизации
JavaScript

Учебный курс по React, часть 10: практикум по работе со свойствами компонентов и стилизации

Учебный курс по React, часть 2: функциональные компоненты
JavaScript

Учебный курс по React, часть 2: функциональные компоненты

Наследование методов, агрегация и композиция Java: определение и особенности
JavaScript

Наследование методов, агрегация и композиция Java: определение и особенности

×