7 июля 2023 759
Продолжаем разбор вопросов из Java-сертификации от Учебного центра IBS вместе с Игорем Судакевичем, сертифицированным Java-разработчиком, уполномоченным инструктором корпорации Oracle и платформы Udemy, Java-методистом c 15-летним опытом. В этой статье мы рассмотрим применение Threads и Executors и поможем вам подготовиться к тестированию.

Допустим, вопрос касается создания потоков (также известных как «подпроцессы», threads) на базе интерфейсов Runnable и Callable. Кроме того, планируется, что управлять исполнением задач в многопоточном режиме будет объект ExecutorService. Итак:


photo_2023-07-07_10-33-43.jpg


Каков результат? Выбрать два ответа:

A. Severe Info Warning

B. Severe Warning Info

C. Severe Severe Info

D. Severe Info

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

На экзамен уровня «Продвинутый» вынесены подтемы из раздела Concurrency, касающиеся утилитарного класса Executors и интерфейса ExecutorService. Кроме того, экзамен активно интересуется пулами потоков, которые имплементируют интерфейс ExecutorService.

В первых версиях Java на программиста возлагалась ответственность за создание и управление жизненным циклом потоков. Поскольку создание thread'ов ограничено ресурсами операционной системы, была придумана концепция пула потоков («thread pool»), чтобы набор thread'ов мог обслуживать куда больше исполняемых фоновых задач. Другими словами, вместо того чтобы для каждой задачи создавать отдельный поток и затем разрушать его, можно заранее создать несколько thread'ов и настроить их так, чтобы они могли принимать и исполнять «заказы» (например, Runnable-объектов). Поток, приостанавливающий такой «заказ», исполнит его и по завершении вернется в пул, где ему могут поручить очередной «заказ», и так далее.

Готовые решения для thread-пулов появились в Java API с выходом «пятерки». Интерфейсы Executor и ExecutorService представляют собой генерализацию thread-пулов и поддерживаемых видов взаимодействий. Кроме того, ряд имплементаций ExecutorService можно инстанцировать с помощью класса Executors, где содержится набор соответствующих фабричных методов. Эти три дата-типа расположены в пакете java.util.concurrent наряду с другими высокоуровневыми классами и интерфейсами, призванными помочь разработчику с решением проблем многопоточного программирования.

В то время как базовый интерфейс Executor предназначен для исполнения задач, описанных в объектах, являющихся имплементаторами интерфейса Runnable, на практике мы чаще используем ExecutorService, представляющий собой дочерний интерфейс Executor'а, поскольку ExecutorService дает нам дополнительную возможность исполнять Callable-задачи и прекращать прием задач для всего пула. Напомним, что интерфейс Callable предполагает возвращение некого результата, который будет асинхронно получен подпроцессом, являющимся инициатором исполнения задания.

Интересно отметить, что ни Executor, ни ExecutorService не предписывают специфическую стратегию исполнения задач. Одни имплементации ведут многопоточную обработку в пуле фиксированного размера, приводя порой к появлению очередей из задач, поджидающих, когда наконец высвободится очередной thread. Другие имплементации умеют самостоятельно создавать рабочие потоки по мере повышения нагрузки и даже «подчищать за собой», когда необходимость в добавочных thread'ах исчезает. Есть и имплементация, где задачи исполняются строго последовательно, поскольку на все про все выделяется один-единственный thread. Какую стратегию взять, зависит от конкретной прикладной области, поэтому разработчик должен проанализировать архитектуру и потребности приложения.

Вышеперечисленные стратегии реализованы в следующих фабричных методах утилитарного класса Executors:

  • newFixedThreadPool(int nThreads)
  • newCachedThreadPool()
  • newSingleThreadExecutor()

Первые два создают пулы с несколькими рабочими потоками, метод newSingleThreadExecutor() возвращает сервис, который обсчитывает задачи строго по очереди в одном-единственном thread'е.

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

У нас есть целый ряд задач для обсчета и есть основания ожидать, что пул из нашего вопроса будет содержать несколько thread'ов в многопоточном режиме. Вот почему отсутствует гарантия, что задача будет досчитана первой по счету, второй и так далее, причем вне зависимости от порядка их запуска на исполнение. Другими словами, невозможно заранее сказать, в какой последовательности будут печататься сообщения в консоли. Отсюда следует, что правильными ответами будут варианты A и B.

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

Теперь поподробнее о методе shutdown(). После его вызова ExecutorService не станет принимать новые поручения, но запущенные задачи будут досчитаны до конца. Отсюда получаем, что, если мы поручили пулу три задачи и затем вызвали shutdown(), в случае штатного завершения в консоли появятся все три сообщения. Поскольку вариант D перечисляет только два сообщения и не упоминает вылет какого-либо исключения, мы приходим к выводу, что опция D тоже является ошибочной.

А что, если какая-то задача обсчитывается настолько долго, что мы вылетим за границу таймаута в 15 секунд после требования закрыть пул? Ведь в этом случае мы не увидим все три сообщения, верно?

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

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

Хотите пройти сертификацию по Java в Учебном центре IBS?

Учебный центр IBS предлагает программу сертификации по Java, которая поможет вам достичь ваших целей и повысить свою квалификацию. Пройдя сертификацию по Java в Учебном центре IBS, вы получите не только официальное признание ваших знаний, но и уверенность в своих навыках. Программа разработана экспертами в области Java и покрывает все основные аспекты языка, включая синтаксис, объектно-ориентированное программирование, коллекции, многопоточность и многое другое. Следите за расписанием сертификаций и начните свой путь к успеху уже сегодня!

Последние статьи в блоге

Выгодный май — на курсы залетай!

Друзья, спешим поделиться отличной новостью — вы можете получить скидки до 40% на наши популярные курсы. Это отличная возможность улучшить навыки и инвестировать в профессиональное развитие по более выгодной цене. Выбирайте направление и подавайте заявку прямо сейчас!

05 мая 2025

Кейс: кастомизация курса по Jira

Кейс по проведению кастомизированного курса «Основы Jira» для крупной российской компании, занимающейся производством цифровой техники.

05 мая 2025

Зачем специалистам по 1С изучать системный анализ и архитектуру ПО

Как системный анализ и архитектура ПО помогают эффективнее работать в 1С.

29 апреля 2025

Банка Nutella, IT, ESG — что общего?

Когда вы читали этикетку на продукте не из-за состава, а из-за ESG-маркировки?

25 апреля 2025

Каковы плюсы и минусы монолитной и микросервисной архитектуры при разработке ИТ-продуктов?

Монолитная и микросервисная архитектуры представляют собой два различных подхода к разработке ИТ-продуктов, каждый из которых имеет свои преимущества и недостатки.

25 апреля 2025

Станьте архитектором ПО с выгодой! Только в апреле сэкономьте 20 000 ₽ и получите новый модуль по микросервисам в подарок

24 апреля стартует обучение на комплексной программе «Архитектор ПО. Путь к мастерству в проектировании систем»*.

14 апреля 2025

Архитектурные ошибки в корпоративных системах, которые могут создать проблемы в долгосрочной перспективе

В основе любой информационной системы — сложная структура. Спроектировать ее не легче, чем построить дом. Какие ошибки можно допустить при планировании ИТ-архитектуры, и в чем их основные причины? К чему они могут привести в долгосрочной перспективе и как этого избежать? Рассказывает Михаил Рощин, заместитель директора отделения управления проектами и архитектуры IBS.

Новости
10 апреля 2025

Кейс: Интенсив по управлению проектами для промышленной компании

Мы адаптировали курс по управлению проектами под запрос команды крупной промышленной компании и провели обучение. Вот что из этого вышло.

27 марта 2025

Кейс: Обучение сотрудников крупной компании работе с ClickHouse

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

19 марта 2025

Платформа сертификации IBS получила аккредитацию АПКИТ

Ассоциация предприятий компьютерных и информационных технологий (АПКИТ) приняла новый регламент сертификации ИТ-специалистов.

Новости
10 марта 2025

Специальные акции на учебные программы

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

06 марта 2025

Как остановить спам-атаку

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

06 марта 2025

Учебный центр IBS подписал партнерское соглашение с ООО «РусБИТех-Астра», разработчиком российской операционной системы Astra Linux.

Теперь мы можем проводить авторизованное обучение по работе с Astra Linux для специалистов в области информационной безопасности.

17 февраля 2025

Двойная выгода: покупай один курс — получай второй за 50% стоимости!

Воспользуйтесь возможностью изучить более глубокие аспекты одной области — например, при покупке курса по Java, архитектуре ПО, управлению проектами, системному и бизнес-анализу, тестированию ПО и Big Data вы можете получить второй курс этой же тематики за полцены! Не упустите шанс развить свои навыки и поднять свою карьеру на новый уровень. 

29 января 2025

Сертификация преподавателя Java-разработки для крупного провайдера ИТ-обучения

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

Новости
21 января 2025

Системный аналитик 100 lvl — дорожная карта развития

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

23 декабря 2024

Платформа сертификации IBS признана лучшим digital-решением для корпоративного обучения

Центр сертификации IBS стал обладателем Гран-при премии «Смарт пирамида» — одной из самых престижных российских премий за достижения в области обучения и развития человеческого капитала.

20 декабря 2024

Учебный центр IBS получил сертификат ГОСТ Р ИСО 9001-2015

В октябре 2024 года Учебный центр IBS получил сертификат соответствия ГОСТ Р ИСО 9001-2015. Это важное достижение подтверждает, что мы придерживаемся высоких стандартов качества и результативно управляем образовательными процессами организации.

19 декабря 2024

9 курсов со скидкой до 50%

Друзья, в январе стартует 9 курсов, обучение на которых можно купить со скидкой до 50%*! 

15 декабря 2024

8 заблуждений про тестирование

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

15 декабря 2024

Не нашли, что искали? — Просто напишите, и мы поможем

Корпоративное обучение Оценка персонала Сертификация О нас Стань тренером Блог
Пользователь только что записался на курс ""
Спасибо!
Форма отправлена успешно.