Тимур Машнин - Многопоточное программирование в Java

Многопоточное программирование в Java
Название: Многопоточное программирование в Java
Автор:
Жанр: Книги о компьютерах
Серии: Нет данных
ISBN: Нет данных
Год: Не установлен
О чем книга "Многопоточное программирование в Java"

В многопроцессорных системах многопоточность решает проблему параллельного выполнения кода с наименьшими затратами.Поэтому многопоточность используется в большинстве реальных приложений.И Java, как и большинство языков программирования, поддерживает многопоточность.Познакомьтесь с реализацией процессов и потоков в Java, с управлением и синхронизацией потоков.Узнайте о пуле потоков, потокобезопасных коллекциях, синхронизаторах и параллельных потоках Stream.

Бесплатно читать онлайн Многопоточное программирование в Java


© Тимур Машнин, 2021


ISBN 978-5-0053-1464-2

Создано в интеллектуальной издательской системе Ridero

Процессы и потоки


Чтобы начать работу с основами многопоточного программирования, давайте начнем с изучения потоков.

Каждая операционная система поддерживает потоки в той или иной форме.



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

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

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

На самом деле, можно сказать, что практически каждый процесс, запущенный у вас в системе, имеет несколько потоков.

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

Например, Windows – это многозадачная операционная система, то есть она может одновременно выполнять две и более программ или процессов.

И Windows – это также и многопоточная операционная система.

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

Выполнение этих потоков планируется так же, как и выполнение процессов.

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

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

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

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

Но при этом теряется производительность.

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

Система будет посылать каждый поток на отдельное ядро.

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

Но тут есть проблема.

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

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

Если у вас есть многоядерный процессор, и у нас есть два ядра или два процессора P0 и P1, у вас будет возможность создать единицы выполнения, называемые потоками, T1, T2, T3.



И операционная система сама позаботится о планировании этих потоков на процессорах по мере их доступности.

Таким образом вы получаете многопоточное выполнение.

Платформа Java обеспечивает поддержку многопоточности с помощью пакета java.util.concurrent.

В многопоточном программировании существуют две основные единицы исполнения – это процессы и потоки.



И многопоточное программирование на Java в основном касается потоков.

Чем отличается поток от процесса?

Процесс имеет автономную среду исполнения.



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

Процессы часто ассоциируются с приложением.

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

Для облегчения взаимодействия между процессами большинство операционных систем поддерживают Inter Process Communication (IPC).

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

Java поддерживает IPC с помощью сокетов, библиотек RMI и CORBA.

Каждый экземпляр работающей виртуальной машины Java представляет собой один процесс.

Приложение Java может создавать дополнительные процессы с помощью объекта ProcessBuilder.

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

Потоки используют общие ресурсы процесса, включая память и открытые файлы.

Это обеспечивает эффективное, но потенциально проблематичное взаимодействие между процессами.

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

Каждый поток имеет свой собственный кеш памяти.

Если поток читает общие данные, он сохраняет эти данные в своем собственном кеше памяти.

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

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

При этом ускорение программы с помощью многопоточных вычислений на нескольких процессорах ограничено размером последовательной части программы. Это так называемый закон Амдала.

Этот закон гласит следующее – В случае, когда задача разделяется на несколько частей, суммарное время её выполнения на параллельной системе не может быть меньше времени выполнения самого длинного фрагмента.

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

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

Проблема видимости возникает, если поток A читает общие данные, которые позже изменяются потоком B, а поток A не знает об этом изменении.

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

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

Как решаются эти проблемы мы обсудим позже.

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

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

Этот поток имеет возможность создавать дополнительные потоки.

Вопрос в том, как мы можем создать, запустить и выполнить поток?

В Java каждый поток представлен экземпляром класса Thread.

Создать поток, или экземпляр Thread, можно двумя способами.



Первый способ, это сначала создать объект Runnable.


С этой книгой читают
Создание пользовательских индикаторов и советников для торговой платформы MetaTrader 5 с использованием языка программирования MQL5.
Bootstrap представляет собой свободный фреймворк интерфейсов для быстрой и простой Web разработки. Bootstrap предоставляет шаблоны дизайна, основанные на HTML и CSS для разметки, форм, кнопок, таблиц, навигации, диалоговых окон, каруселей изображений и многого другого, а также дополнительные плагины JavaScript. На основе Bootstrap можно легко создавать сайты с «отзывчивым дизайном», одинаково хорошо выглядящие на всех типах устройств, от небольши
Разработка индикаторов и советников с использованием языка программирования MQL5 для платформы MetaTrader 5. Второе издание, исправленное и дополненное.
Эта книга предназначена для тех, кто хочет научиться программировать на языке Java.С этой книгой вы обучитесь объектно-ориентированному программированию на платформе Java SE и научитесь применять принципы ООП на практике.Эта книга охватывает важные аспекты программирования на языке Java, начиная с основ и заканчивая объектно-ориентированным подходом и командной разработкой кода.
Данная книга о истории возникновения и успеха легендарного музыкального проекта «А. НЕМЕЦЪ», предназначена для широкого круга читателей, а также для отечественных и зарубежных подвижников и специалистов, осуществляющих исследовательскую деятельность в сфере неформальной культуры, массовой социологии и практической мистики. Книга публикуется в серии «Всемирная Библиотека Современного Русского Самиздата».Часть информации можно найти в ранее опублик
Данная книга является одной из работ сборника «#ОТКРОВЕНИЯ». Она представляет из себя небольшое юмористическое издание, состоящее из пятидесяти откровений, посвящённых социальным сетям.
Для среднего школьного возрастаПравдивые приключения двух девочек в компьютерном мире. Хотя, конечно, некоторые дяди и тети могут посчитать их сказкой. Знакомство с устройством компьютера, путешествие по просторам Интернета, борьба с компьютерными вирусами, поиск выхода из лабиринта слов и другие приключения, с которыми может столкнуться каждый в современном компьютеризированном мире.
В данной книге излагаются основы творения познания Разумом и Рассудком, Действительности в Бытие, как новой картины мира, и Реальности в Небытие субстанции человека.Также излагаются Софизмы о Действительности с точки зрения инженера. Утверждается, что излучения творятся в Настоящем непрерывно, что Энергия – это атрибут Излучения.
Книга о легендарном имаме Дагестана и Чечни. Долгие годы Мариам посвятила изучению документов, касающихся героических и трагических страниц Кавказской войны, жизни-борьбы Имама Шамиля. Роман показывает единение Кавказа и России – как историческую неизбежность; отношения между людьми, обречёнными убивать друг друга и страстно протестующими против этой обречённости; великие моменты просветления, когда обе стороны проникаются трагическим осознанием
Начало XX века. Напряжение в отношениях крупнейших империй мира достигло предела. В воздухе явственно ощущается запах большой войны. Британская империя стремится не допустить укрепления и возвышения Германии, претендующей на свой «кусок пирога» от заокеанских колоний. В то же время не первый десяток лет идет скрытная борьба между Россией и Соединенным королевством за господство в Центральной Азии и Индии. В этой ситуации Николай II, после долгих
"Колдовской снег" - фантастический роман Марго Генер, жанр приключенческое фэнтези, попаданцы. Мудрые люди советуют следить за речью, мол, слово не воробей, никогда не знаешь, где и как оно отзовется. Мирослава, бойкая современная девушка, тоже не знала. Но это не освободило ее от ответственности, теперь ей придется отправиться очень далеко, чтобы вернуть того, кого унес колдовской снег.
"Варвара. Трость и плащ Асмодея" - фантастический роман Марго Генер, жанр приключенческое фэнтези, попаданцы. Коварный демон блуда и похоти снова что-то задумал. И конечно же расхлебывать предстоит мне, ведьме-яге, которая охраняет границы миров. Зачем-то он похитил какого-то парня, и мне предстоит спуститься за ним туда, куда ни один человек в здравом уме не пойдет! К тому же там всюду демоны и почему-то им от меня нужны любовь и участие. Но я в