- Ставки и прогнозы на матч Манчестер Сити - Интер (финал ЛЧ 2023)
- Жители Красного Бора (Нового Пьяного Бора) до революции
- История Красного Бора Татарстан (Новый Пьяный Бор Елабужского уезда) в статьях
- Что такое криптокарты?
- Программа для поиска драйверов на любое устройство
- Как технология OCR снижает нагрузку на офис
- Как настроить локальную сеть через Wi-Fi
- Как операционная система Windows стала такой популярной
Java - универсальный мультиплатформенный язык программирования |
Потоки Java: обзорЯзык Java разрабатывался с встроенной поддержкой многопотоковости. Потоки — один из ключевых элементов технологии Java; они поддерживаются как на языковом (синтаксическом) уровне, так и на уровне виртуальной машины Java и библиотек классов. Во многих случаях потоки Java очень похожи на потоки POSIX (pthreads). Библиотеки классов Java предоставляют класс thread, который поддерживает широкий набор методов для запуска, выполнения и остановки потока, а также проверки его состояния. Поддержка потоков в Java включает в себя сложный набор примитивов синхронизации на основе мониторов и переменных условия. На уровне языка методы внутри класса или блоки кода, для которых объявляется синхронизация, не выполняются параллельно. Такие методы или блоки выполняются под контролем мониторов, которые помогают убедиться, что данные, доступ к которым осуществляется в этих методах или блоках, остаются в согласованном состоянии. Каждый объект Java имеет собственный монитор, создание экземпляра и активация которого выполняется виртуальной машиной Java в момент первого использования. Мониторы работают примерно так же, как и пара переменной условия и мьютекса, как они определены в pthreads. Однако, в отличие от pthreads, можно прервать поток Java, пока он находится в состоянии ожидания, например, если он ожидает уведомления о событии или заблокирован при вызове ввода-вывода. Потоки Java: программа 'п'Этот простой пример показывает, как создать распараллеленный вариант программы 'п' с помощью "чистых" потоков Java.
Чтобы запустить новый поток в Java, обычно нужно создать подкласс класса Thread и определить пользовательский метод run(), выполняющий основную работу, которая должна быть распараллелена. В нашем примере эта задача реализована с помощью метода run() класса PITask. Из соображений производительности весь участок интегрирования был разбит на part_step фрагментов, так чтобы число этих фрагментов было равно числу имеющихся процессоров. Объекты PITask принимают параметр part_number, который помечает данный фрагмент участка интегрирования. Таким образом, в теле run() вычисляется промежуточная сумма по данному фрагменту участка интегрирования. Реальный поток запускается и выполняется параллельно после вызова метода start(). Это делается в цикле для всех фрагментов. Затем начинает работать второй цикл, где с помощью метода join() каждого параллельного потока ожидается завершение выполнения последнего, после чего результаты, полученные от каждого потока, суммируются. В данном примере каждый фрагмент участка интегрирования явно назначается отдельному потоку Java. В этом примере потоки Java были созданы явным образом, и в результате, чтобы вручную разделить работу между потоками, пришлось разбить участок интегрирования на фрагменты. Если бы, напротив, число потоков было равно числу отрезков на участке интегрирования, производительность программы была бы очень низкой. Это происходит потому, что создание потока Java в общем случае требует больших затрат ресурсов. Параллельная среда Java FJTaskВ то время как "чистые" потоки Java, описанные в предыдущем разделе, представляют собой самый нижний уровень поддержки многопотоковости в Java, существует еще множество высокоуровневых библиотек распараллеливания, которые предназначены как для расширения базовых возможностей многопотоковости в Java, так и для добавления решений для некоторых часто встречающихся задач. Ярким примером является пакет java.util.concurrent, который входит в стандарт Java начиная с версии 1.5. Этот пакет включает в себя множество усовершенствований базового распараллеливания Java, таких как поддержка пулов потоков, элементарные переменные и сложные примитивы синхронизации. Однако некоторые компоненты пакета util.concurrent не вошли в стандарт J2SE и в настоящее время доступны в виде отдельной библиотеки под названием EDU.oswego.cs.dl.util.concurrent. Одним из наиболее важных таких компонентов является среда FJTask, которая реализует концепцию параллелизма "разветвление-объединение" для Java. Эта среда предназначена, в первую очередь, для распараллеливания сложных вычислений, таких как численное интегрирование или перемножение матриц. Задачи FJTask — это облегченные аналоги потоков Thread. Эту технологию часто называют "параллелизмом на основе задач", в отличие от "параллелизма на основе потоков". Задачи FJTask обычно выполняются с помощью того же пула потоков Java. Задачи FJTask поддерживают вариации самых общих методов класса Thread, включая start(), yield() и join(), Оставьте свой комментарий! Tags:
Похожие статьи: |
Самое читаемое:
- История Красного Бора Татарстан (Новый Пьяный Бор Елабужского уезда) в статьях
- Жители Красного Бора (Нового Пьяного Бора) до революции
- Ставки и прогнозы на матч Манчестер Сити - Интер (финал ЛЧ 2023)