Паттерн программирования «Асинхронность» — особый, хорошо интегрированный случай множественных потоков. Вследствие самой сущности потоков много поточные модели нуждаются в системах уведомления и зависят от шаблонного кода для запуска потоков.
Асинхронные обращения используются даже в одногопоточных средах, таких как NodeJS. Почти все пользовательские интерфейсы поддерживают асинхронное выполнение для удержания UI в активном, реагирующем на действия пользователя состоянии.
Тем не менее асинхронное программирование может быть полезным и в других местах, помимо пользовательских интерфейсов, обычно на серверной стороне. Hи J2SE, ни J2ЕЕ не предоставляли встроенной «легкой» реализации для асинхронного программирования.
С появлением платформы Jаvа ЕЕ 5 был выпущен фреймворк для параллелизма (Concurrency Framework), основанный на JSR166. JSR166 включал множество утилит, делавших асинхронное программирование не только возможным, но и более легким и лучше управляемым. Интерфейс Future<T> также предоставил разработчикам способ реализации асинхронного выполнения метода.
Тем временем Spring представил вниманию разработчиков асинхронные вызовы методов, активизируемые с помощью аннотаций. Платформа Jаvа ЕЕ не включала такое удобное решение вплоть до версии 6. Аннотация @Asynchronous появилась с выходом платформы Jаvа ЕЕ 6 и предоставила удобную возможность реализации асинхронного выполнения метода.
Асинхронное программирование не указано в числе паттернов проектирования ни в книге GoF , ни в «Паттернах проектирования«. Если бы оно там присутствовало, его описание могло бы быть таким: «Обеспечивает способ вызова метода без блокирования вызывающего метода».
Сама сущность выполнения методов заключается в блокировании вызывающего вплоть до завершения выполнения вызванного метода. Такое поведение очевидно и вполне ожидаемо, однако не во всех случаях желательно. Почти все UI-фреймворки и веб-платформы основаны на неблокирующих запросах.
Паттерн «Асинхронность» основан на подходе «самонаведения». когда операция выполняется параллельно или таким образом, при котором не блокируется выполняющий поток, а результат проверяется по мере готовности. Обычно асинхронный подход использует параллельное выполнение. Диаграмма классов не вполне точно отражает суть такого подхода, лучше будет продемонстрировать его с помощью блок-схемы (рис. 1).
Рис. 1. Блок-схема асинхронности