В Java-программировании,По мере увеличения сложности бизнеса,Мы часто сталкиваемся с ситуациями, когда нам необходимо обработать большие объемы данных, выполнить сложные вычисления или вызвать удаленные службы. в этих сценариях,Синхронное программирование часто приводит к блокировке потоков.,Тем самым снижается пропускная способность и скорость отклика системы. Чтобы решить эту проблему,Java предоставляет решение для асинхронного программирования,в@Async
Аннотации — один из важных инструментов асинхронного программирования.。
1. Что такое аннотация @Async?
@Async
даSpringАннотация, предоставленная фреймворком,Используется для пометки метода как выполняемого асинхронно.。Когда мы добавляем к методу@Async
После аннотации,Spring создаст новый поток для выполнения этого метода.,без блокировки основного потока. так,Основной поток может продолжать выполнять другие задачи.,Таким образом достигается эффект асинхронного программирования.
2. Как использовать аннотацию @Async
Включить поддержку асинхронности
в использовании@Async
До аннотации,нам нужно убедитьсяSpringПоддержка асинхронности включена。Это можно сделать, добавив класс конфигурации@EnableAsync
аннотация для достижения。
@Configuration
@EnableAsync
public class AsyncConfig {
// Информация о конфигурации
}
Используйте аннотацию @Async для методов
Добавьте к методам, которые должны выполняться асинхронно@Async
Просто аннотируйте。Например:
/**
* Выполнять запланированное задание каждый час
*/
@Scheduled(cron = "0 0 */1 * * ?")
@Async
public void update() {
updateAccountData();
updateStableFundData();
updateNewFund();
updateAntJinxuanFocusFund();
updateAntJinxuanAdvancedFund();
updateAntJinxuanIndexFund();
updateZhuiqiuzhengshouyiFund();
updateAntJinxuanStableFund() ;
}
при звонкеasyncMethod()
метод,Spring создаст новый поток для выполнения этого метода.,без блокировки вызывающего потока.
3. Что следует учитывать при использовании аннотации @Async
при использовании@Async
Когда аннотированный метод имеет возвращаемое значение,Требуется особое внимание. Поскольку асинхронный метод будет выполнен в новом потоке,Поэтому его возвращаемое значение не будет возвращено непосредственно в вызывающий поток. Если вам нужно получить возвращаемое значение асинхронного метода,мы можем использоватьFuture
илиCompletableFuture
Чтобы получить результат выполнения асинхронного метода。
Поскольку асинхронный метод выполняется в новом потоке,Поэтому любое исключение, созданное в асинхронном методе, не будет распространяться непосредственно в вызывающий поток.。нам нужно пройтиFuture.get()
Метод для получения результата выполнения асинхронного метода,и обрабатывать возможные исключения.
Весной,@Async
аннотации и@Transactional
Аннотации обычно не используются вместе.。Поскольку асинхронные методы выполняются в новых потоках,Транзакции управляются в вызывающем потоке. Если вам необходимо выполнять операции с базой данных асинхронным методом и гарантировать транзакционную,Можно рассмотреть и другие варианты,Например, распределенные транзакции или механизмы компенсации.