Что такое асинхронный вызов?
Асинхронные вызовы соответствуют синхронным вызовам.Предполагая, что есть три несвязанные задачи, ожидающие выполнения, метод синхронных вызовов заключается в ожидании один за другим, то есть вторая задача запускается после завершения первой задачи.... и скоро.
Однако компьютеры могут выполняться одновременно, а использование синхронных вызовов занимает слишком много времени, поэтому мы хотим открыть три округа для одновременной обработки этих трех задач, что требует использования аннотации @Async.
Как использовать @Async
Использовать аннотации @Async в весеннем загрузочном проекте очень удобно.
Просто нужно добавить в класс запуска проекта@EnableAsync
аннотацию, а затем добавьте ее в метод, который вы хотите вызвать асинхронно.@Async
Вот и все.
Пример использования
Сначала давайте посмотрим на результат синхронного вызова.
Добавьте следующие три метода в наш тестовый класс.
Затем назовите это.
Результат выполнения показан на следующем рисунке:
Как видите, три задачи выполняются последовательно и вызываются с использованием одного и того же потока.
Общее время равно сумме затрат времени на выполнение трех задач.
Как насчет асинхронных вызовов?
Сначала добавьте класс TestService, добавьте три вышеуказанных метода в этот класс и отметьте каждый@Async
аннотация.
Как показано ниже:
назови это.
Полученный результат выглядит следующим образом:
Можно четко видеть, что первое, что нужно распечатать, - это выполнить все задачи, потому что только основной нить отвечает только за запуск этих трех задач, а затем оператор печати выводится без ожидания выполнения задачи.
В то же время хорошо видно, что три задачи начинаются и заканчиваются случайным образом и выполняются в разных потоках.
@Async
Использование аннотаций очень простое, но очень практичное.В процессе кодирования много вызовов, которые не нужно ждать результата (конечно, мы можем получить результат и через Future).На данный момент это аннотацию можно использовать для повышения скорости возврата общего результата.
Меры предосторожности
Я использую его в первый раз@Async
Когда я ступил на яму, я только заметил, что большие ребята использовали эту аннотацию, но не читали ее подробно.асинхронный методОн написан в том же классе, что и метод, который его называет, поэтому асинхронная аннотация не имеет никакого эффекта. Вот почему.
Картинка перенесена по реферальной ссылке:
Когда мы отметили метод b класса A с помощью@Async
Примечания (картинка@Transactinal
, тот же принцип), после того как Spring просканирует аннотацию, он создаст прокси-класс proxy$A для класса A и добавит соответствующую операцию в начало аннотированного метода, как показано на рисунке.startTransaction()
,использовать@Async
Когда это работа запуска нового потока (не смотрите исходный код специально).
В это время, если метод A вызывается экземпляром класса C, цифра 1 перескакивает на маркер 1, затем вызывается исходный метод B без запуска нового потока.
Однако при прямом вызове метода b класса A через экземпляр класса B на отметке 2 операция запуска нового потока автоматически добавляется spring, поэтому можно реализовать асинхронный вызов.
постскриптум
Параллельное программирование — это препятствие, которое программисты не могут обойти, иначе каждый день время вашего сервиса истекает, и средства мониторинга не смогут его отследить.@Async
Это очень простое знание параллелизма, даже не знание.Простое обращение к знанию может значительно повысить скорость работы нашей программы.
Ссылка на ссылку
Заканчивать.
ChangeLog
2018-10-29 ЗавершеноВсе вышеизложенное является личными мыслями, если есть какие-либо ошибки, пожалуйста, исправьте их в комментариях.
Добро пожаловать на перепечатку, пожалуйста, подпишите и сохраните исходную ссылку.
Контактный адрес электронной почты: huyanshi2580@gmail.com
Дополнительные заметки об обучении см. в личном блоге ------>Хуян тен