java异步编程

1,503 阅读4分钟

本章主要介绍异步编程的概念与作用,Java中异步编程的场景以及 不同异步编程场景应使用什么技术来实现。

1.1 异步编程概念与作用

通常Java开发人员喜欢使用同步代码编写程序,因为这种请求 (request)/响应(response)的方式比较简单,并且比较符合编程人员 的思维习惯;这种做法很好,直到系统出现性能瓶颈。在使用同步编程 方式时,由于每个线程同时只能发起一个请求并同步等待返回,所以为 了提高系统性能,此时我们就需要引入更多的线程来实现并行化处理。 但是多线程下对共享资源进行访问时,不可避免会引入资源争用和并发 问题;另外,操作系统层面对线程的个数是有限制的,不可能通过无限 增加线程数来提供系统性能;而且,使用同步阻塞的编程方式还会浪费 资源,比如发起网络IO请求时,调用线程就会处于同步阻塞等待响应结 果的状态,而这时候调用线程明明可以去做其他事情,等网络IO响应结 果返回后再对结果进行处理。

可见通过增加单机系统线程个数的并行编程方式并不是“灵丹妙 药”。通过编写异步、非阻塞的代码,则可以使用相同的底层资源将执 行切换到另一个活动任务,然后在异步处理完成后再返回到当前线程继 续处理,从而提高系统性能。

异步编程是可以让程序并行运行的一种手段,其可以让程序中的一 个工作单元与主应用程序线程分开独立运行,并且在工作单元运行结束 后,会通知主应用程序线程它的运行结果或者失败原因。使用异步编程 可以提高应用程序的性能和响应能力等。 比如当调用线程使用异步方式发起网络IO请求后,调用线程就不会 同步阻塞等待响应结果,而是在内存保存请求上下文后,马上返回去做 其他事情,等网络IO响应结果返回后再使用IO线程通知业务线程响应结 果已经返回,由业务线程对结果进行处理。可见,异步调用方式提高了 线程的利用率,让系统有更多的线程资源来处理更多的请求。

比如在移动应用程序中,在用户操作移动设备屏幕发起请求后,如 果是同步等待后台服务器返回结果,则当后台服务操作非常耗时时,就 会造成用户看到移动设备屏幕冻结(一直处于请求处理中),在结果返 回前,用户不能操作移动设备的其他功能,这对用户体验非常不好。而 使用异步编程时,当发起请求后,调用线程会马上返回,具体返回结果会通过UI线程异步进行渲染,且在这期间用户可以使用移动设备的其他 功能。

1.2 异步编程场景

在日常开发中我们经常会遇到这样的情况,即需要异步地处理一些 事情,而不需要知道异步任务的结果。比如在调用线程里面异步打日 志,为了不让日志打印阻塞调用线程,会把日志设置为异步方式。如图 1-1所示的日志异步化打印,使用一个内存队列把日志打印异步化,然 后使用单一消费线程异步处理内存队列中的日志事件,执行具体的日志 落盘操作(本质是一个多生产单消费模型),在这种情况下,调用线程 把日志任务放入队列后会继续执行其他操作,而不再关心日志任务具体 是什么时候入盘的。

资料:

mp.weixin.qq.com/s?src=11&ti…

可以关注我的公众号:

个人介绍:

职业:高级软件开发工程师

城市:上海3年,常驻杭州

知识星球:践行读书会

写作:7天一篇写7年

个人标签:程序员、践行读书会创始人、自律践行者:坚持6:00起床7年、90后开心奶爸、《亲密关系》践行者:解决问题的唯一标准——每个人都真心的感受到了爱!