当前位置: 首页 > news >正文

java~@Async异步功能

@Async注解,可以实现异步处理的功能,它可以有返回值,或者直接在新线程时并行执行一个任务,对于异步来说,它的执行是有条件的,你需要把异步代码块放在单独的类里,当spring在注入时,才不会相互影响,因为异步是一个比较特殊的代理。

异步入口

@EnableAsync

具体的异步方法

/**
 * 异常的类型应该和同步执行的类分开,这样在ioc建立时不会相互干扰
 */
@Service
public class MessageService {
  @Async
  public void msg1() throws Exception {

    Thread.sleep(5000L);
    System.out.println("async1:" + LocalDateTime.now() +
        ",id:" + Thread.currentThread().getId());
  }
}

上面代码中的异步,是一个没有返回值的,一般像发送消息可以采用这种方式。

带有返回值的异步

@Async
  public Future<String> asyncMethodWithReturnType() {
    System.out.println("Execute method asynchronously - "
        + Thread.currentThread().getName());
    try {
      Thread.sleep(5000);
      return new AsyncResult<String>("hello world !!!!");
    } catch (InterruptedException e) {
      //
    }
    return null;
  }

这种会返回一个委托对象Future,我们如果希望得到它的返回时,需要在主程序中去监听它,就是写在循环,去等待它的返回结果。

Future<String> future = messageService.asyncMethodWithReturnType();

    while (true) { ///这里使用了循环判断,等待获取结果信息
      if (future.isDone()) { //判断是否执行完毕
        System.out.println("Result from asynchronous process - " + future.get());
        break;
      }
      System.out.println("Continue doing something else. ");
      System.out.println("main end:" + LocalDateTime.now() +
          ",id:" + Thread.currentThread().getId());

    }

上面代码主程序在执行到异步方法时,由于遇到了while(true),所以会租塞,直到有返回结果为止。

相关文章:

  • 给Prometheus造假数据的方法
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • java Concurrent包学习笔记(六):Exchanger
  • 理解 Web 中的Session
  • bzoj3295: [Cqoi2011]动态逆序对
  • 北大、微软提出NGra:高效大规模图神经网络计算
  • SQL Server事务日志管理的进阶,第5级:在完全恢复模式下管理日志
  • zabbix3.4 端口和进程监控配置
  • Java 面试之技术框架
  • db cursor
  • Kubeflow 公布 1.0 路线图:2019 年实现 API 稳定
  • Finale
  • String不得不说的那些事
  • 利用React 16.6新特性优化应用性能
  • ajax的19道经典面试题
  • ECMAScript入门(七)--Module语法
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js ES6 求数组的交集,并集,还有差集
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • magento 货币换算
  • maven工程打包jar以及java jar命令的classpath使用
  • MySQL的数据类型
  • MySQL-事务管理(基础)
  • Next.js之基础概念(二)
  • October CMS - 快速入门 9 Images And Galleries
  • Python_OOP
  • React-flux杂记
  • spring security oauth2 password授权模式
  • SpriteKit 技巧之添加背景图片
  • Vue.js 移动端适配之 vw 解决方案
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 跨域
  • 如何在GitHub上创建个人博客
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一个SAP顾问在美国的这些年
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ![CDATA[ ]] 是什么东东
  • #define与typedef区别
  • #Linux(make工具和makefile文件以及makefile语法)
  • $$$$GB2312-80区位编码表$$$$
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (LeetCode 49)Anagrams
  • (pojstep1.1.2)2654(直叙式模拟)
  • (vue)页面文件上传获取:action地址
  • (接口封装)
  • (三)模仿学习-Action数据的模仿
  • (十一)图像的罗伯特梯度锐化
  • (四)模仿学习-完成后台管理页面查询
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)我也是一只IT小小鸟