一般情况下用于for循环中的异步操作,一般是一个List集合,进行for循环操作,然后可以开启一个或多个线程,使性能提高,多个线程之间前后操作不相互影响,或者用于前端的异步操作
/**
* @author blue
*/
@SuppressWarnings({"Duplicates", "JavaDoc"})
@Service
public class RecommenderServiceImpl implements RecommenderService {
private ThreadPoolExecutor threadPoolExecutor;
/**
* 前台获取推广员信息
*
* @param id
* @return
*/
@Override
public FrontInfoVO getFrontInfo(Long id) {
LOGGER.info("id = {}", id);
//基础信息
RecommenderDO recommenderDO = this.getRecommenderByPrimaryKey(id);
LOGGER.info("recommenderDO = {}", recommenderDO);
//详细信息
CompletableFuture<RecommenderDetailDO> detailCf = CompletableFuture
.supplyAsync(() -> this.getRecommenderDetailByRecommenderId(id), threadPoolExecutor);
//城市信息
CompletableFuture<CityDTO> cityCf = CompletableFuture
.supplyAsync(() -> cityService.getCityInfo(recommenderDO.getCityCode()), threadPoolExecutor);
//基础信息
FrontInfoVO frontInfoVo = new FrontInfoVO();
frontInfoVo.setId(recommenderDO.getId());
frontInfoVo.setAccount(recommenderDO.getPhone());
frontInfoVo.setPhone(recommenderDO.getPhone());
//detailCf执行完之后,执行以下操作
RecommenderDetailDO recommenderDetailDO = detailCf.join();
LOGGER.info("recommenderDetailDO = {}", recommenderDetailDO);
//是否已完善
if (null != recommenderDetailDO) {
frontInfoVo.setName(recommenderDetailDO.getRealName());
frontInfoVo.setIdCardNo(recommenderDetailDO.getIdCardNo());
frontInfoVo.setAddress(recommenderDetailDO.getAddress());
frontInfoVo.setEmail(recommenderDetailDO.getEmail());
frontInfoVo.setComplete(true);
} else {
frontInfoVo.setComplete(false);
}
//cityCf执行完之后,执行以下操作
CityDTO cityDTO = cityCf.join();
LOGGER.info("cityDTO = {}", cityDTO);
frontInfoVo.setCompany(COMPANY_NAME_GENERATOR.apply(
Optional.ofNullable(cityDTO).map(CityDTO::getName).orElse("***")));
LOGGER.info("frontInfoVo = {}", frontInfoVo);
return frontInfoVo;
}
}
@Async
用于一个service中调用另外一个service时,如果要想使性能提高点,第二个service中的方法执行的结果不影响第一个service中的代码,或者说在第一个service中是项目运行的主流程,第二个service是主流程之外要调用的方法,为了不影响主流程的使用,保证主流程的安全,或者为了提高主流程的性能,在第二个service方法上加上@Async注解