Статьи

Java EE 7 – утилиты для параллелизма

Утилиты параллелизма ( JSR 166 ) — это новый стандарт Java EE, который поставляется со  спецификацией Java EE 7  . Этот стандарт касается представления  Executor API,  который был представлен в Java 1.5 как контейнерные и управляемые объекты.

Executor API находится под   заголовком High-Concurrency Objects в документах Java SE, представленных Oracle. Executor API обеспечивает управление потоками эффективно с помощью объектов, которые он предлагает. В целом, эта эффективность обеспечивается несколькими   механизмами пула потоков . ,

Пул потоков

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

токарно-бассейн

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

диспетчер задач

Например, этот показывает серию процессов и количество потоков, которыми он управляет, которые выполняются на моей машине. Хорошо видно, что приложение idea.exe содержит 71 элемент. Когда вы смотрите на другие приложения, вы видите, что используется меньше потоков. Итак, если у меня есть 5000 частей задач и я разделил эти 5000 частей задач на 5000 различных потоков, значит ли это, что я настроил хорошую архитектуру? (Конечно, нет : )

Если на самом деле я заставляю запускать задачи, делая выбор (случайный или приоритетный) из этих 5000 задач с указанным количеством рабочих потоков, я эффективно использую системные ресурсы и не подвергаю систему ненужной нагрузке. Поскольку на приведенной выше диаграмме определено 5 частей рабочего потока, влияние этих задач на систему, которую он запускает, будет видно не более чем для 5 пользовательских задач. По завершении рабочего потока будет выбрана одна из ожидающих в данный момент задач, и этот рабочий процесс будет продолжаться до тех пор, пока все задачи не завершатся. Итак, основная философия Executor API, которая поставляется с Java SE 1.5, заключается в обеспечении эффективного управления потоками, предлагая различные среды пула потоков. Рабочие потоки — это общий тип потоков, генерируемых фабрикой потоков.

нить бассейн-N

Базовыми типами интерфейса в Executor API являются ExecutorService и ScheduledExecutorService. Реализация этих интерфейсов может быть различной статических методы Исполнитель сек  класса.

Новый Стандарт утилит параллелизма, который поставляется с Java EE 7, делает эти типы объектов инъекционными и управляемыми контейнерными сервисами. Однако объекты управляемого контейнера контейнера отображаются с именами  Managed ExecutorService и  Managed ScheduledExecutorService с точки зрения представления управляемости. Если вы посмотрите на UML-диаграммы этих интерфейсов, то увидите, что интерфейсы API Java SE Executor расширены.

UML-параллелизм-объекты

Интерфейсы, которые начинаются с управляемого, в основном обеспечивают те же операции, что и компоненты API Executor, которые поставляются с Java 1.5. Разница здесь заключается в том, чтобы представить новые объекты в качестве  контейнерных ресурсов  разработчикам.

Контейнерные ресурсы — это специальные объекты, управляемые серверами приложений. Источники данных — это источники данных, ресурсы JMS и блоки параллелизма со стандартом утилит параллелизма.

Контейнерные ресурсы — это объекты, которые находятся на сервере приложений и выполняют определенные функции. Доступ к этим объектам может быть установлен стандартом  JNDI  (Java Naming and Directory Interfaces). Эта операция доступа может быть достигнута в основном с помощью   аннотации @Resource или   объектов типа интерфейса Context (например, InitialContext).

Создание ресурсов параллелизма

Управляемые объекты-исполнители в Concurrency Utilities могут быть созданы на серверах приложений, которые поддерживают спецификацию Java EE 7. Например, этот процесс создания может быть определен визуально с помощью набора команд asadmin для Glassfish 4 или через консоль администратора Glassfish.

Инструмент asadmin в каталоге / bin сервера приложений Glassfish используется для операций командной строки. В следующем примере запускается инструмент asadmin, и управляемые объекты executor создаются в интерактивном режиме с помощью   команд create-managed-executor-service  или  create-managed-schedule-executor-service . Поскольку ресурсы контейнера предоставляются средам приложения с выражениями доступа, которые были определены в стандарте JNDI, уникальный идентификатор доступа, который представляет этот ресурс контейнера, должен быть введен в консоль.

asadmin-параллелизм-коммунальные услуги

Эти созданные управляемые объекты-исполнители можно увидеть через консоль администратора Glassfish. Точно так же эти операции добавления и редактирования могут быть сделаны через консоль администратора.

GlassFish-админ-консоль-concurrrent-коммунальные услуги

Контейнерные ресурсы на Glassfish 4 отображаются на   вкладке Ресурсы . Параллельные ресурсы отображаются на вкладке «  Параллельные ресурсы» . В то время как  ресурсы ManagedExecutorService  и  ScheduledManagedExecutorService,  которые мы создали как управляемые контейнером, находятся в этой части,  также доступны ресурсы параллелизма с  префиксом __default, которые были определены непосредственно на сервере приложений. При желании можно также использовать существующие ресурсы по умолчанию.

Получение ресурсов утилит параллелизма

Ресурсы параллелизма, которые находятся на сервере приложений, могут быть получены посредством аннотации @Resource с внедрением или через объекты InitialContext. Аннотация @Resource и объект InitialContext обеспечивают стандартный доступ JNDI не только к ресурсам параллелизма, но и ко всем другим ресурсам контейнера.

@WebServlet(urlPatterns = "/kodcu",name = "KodcuServlet")
public class KodcuServlet extends HttpServlet {

@Resource // (1)
private ManagedExecutorService defaultmanagedExecutorService;

@Resource // (2)
private ManagedScheduledExecutorService defaultScheduledExecutorService;

@Resource(lookup = "concurrent/KodcuExecutor") // (3)
private ManagedExecutorService managedExecutorService;

@Resource(lookup = "concurrent/KodcuScheduledExecutor") // (4)
private ManagedScheduledExecutorService scheduledExecutorService;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

...

InitialContext context=new InitialContext(); // (5)

ManagedExecutorService managedExecutorServiceWithContext = (ManagedExecutorService) context.lookup("concurrent/KodcuExecutor");

...

}

}

В приведенном выше классе сервлетов ресурсы параллелизма по умолчанию (номер 1 и 2) и ресурсы, созданные с помощью указания имени JNDI в командной строке (номер 3 и 4), получают с помощью аннотации @Resource с внедрением ресурса. Поле поиска аннотации @Resource получает соответствующий объект с уникальным идентификатором доступа к ресурсу, который был определен в стандарте JNDI. Когда аннотация @Resource используется без атрибута поиска, вводятся ресурсы JNDI с префиксом __default. В разделе 5, кроме метода внедрения, ресурс параллелизма получается в соответствии с соответствующим именем JNDI через объект InitialContext.

Вы можете получить доступ к примеру по следующей ссылке

http://en.kodcu.com/2013/10/java-ee-7-concurrency-utilities-spesification/

На данный момент.