Java中怎么实现响应式编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
专业从事企业网站建设和网站设计服务,包括网站建设、域名注册、虚拟空间、企业邮箱、微信公众号开发、微信支付宝小程序开发、App定制开发、软件开发、等服务。公司始终通过不懈的努力和以更高的目标来要求自己,在不断完善自身管理模式和提高技术研发能力的同时,大力倡导推行新经济品牌战略,促进互联网事业的发展。
Reactive概念:
Reactive Programming: 响应式编程,异步非阻塞就是响应式编程,与之相对应的就是命令式编程。是一种基于数据流(data stream)和变化传递的申明式的编程范式。 Reactive并不是一门新技术,不用Reactive照样可是实现非阻塞编程,比如用观察者模式实现。Reactive的另一种实现方式就是消息队列。
Reactive的关键点:
声明式的编程规范,数据流,传播改变,使用动态数组或者静态事件。
spring5实现了一部分Reactive:
Spring WebFlux: Reactive Web(non-blocking servers in genneral)
Spring Web MVC:传统的Servlet Web (serrvlet application in general)
为什么需要反应式的编程
1.命令式编程VS声明式编程
实际上我们大多数程序员都是使用命令式编程,这也是计算机的工作方式。命令式编程就是对硬件操作的抽象,程序员要通过指令,精确的告诉计算机干什么事情。声明式编程是解救程序员的利器,声明式编程更关注的是我要什么(What)而不是怎么去做(How).SQL是经典的声明式语言,我们通过SQL描述想要什么,最终由数据库引擎执行SQL语句并将结果返回给我们。
2.同步编程VS异步编程
在谈到同步与异步的时候就要说一下,阻塞与非阻塞的概念,因为这两组概念很容易混淆。他们描述的是同一个东西,但是关注点不同。阻塞与非阻塞描述的是当前线程的状态,而同步与异步则关注方法调用结果的通知机制。因为是从不同角度描述方法的调用过程,所以这两组概念可以相互组合,即将线程状态以及结果通知机制进行组合。例如JDK1.3之前BIO是同步则塞,JDK1.4及以后的NIO是同步非阻塞,JDK1.7及以后的NIO2是异步非阻塞模式。
同步编程的优点是代码简单并且容易理解,代码按照先后顺序执行,缺点是CPU利用率低,大部分都浪费在IO等待上。
异步编程通过充分利用CPU资源并行执行任务,在执行时间和资源利用率上远远高于同步方法。
同步编程面临的挑战:
传统应用通常基于Servlet容器部署,而Servlet是基于线程的请求处理模型。从上文的讨论中我们发现,通常需要设置一个较大的线程池获得良好的性能,较大的线程池会导致以下三个问题:
1.额外的内存开销。在Java中每个线程都有自己栈空间,默认是1MB。如果线程池的大小被设置为200,那么需要200MB内存,一方面造成内存浪费,一方面导致应用启动慢。
2.CPU利用率低 有两个方面会导致CPU利用率很低。一方面是JDK1.2之后,每个平台的JVM实现都使用1:1线程模型,这意味着一个java线程会被映射到一个轻量级进程,而有效的轻量级进程数取决于CPU的个数以及核数。如果Java的线程数远大于轻量级进程数,则频繁的线程上下文切换会浪费大量的CPU时间,另一方面,由于传统的远程操作或者IO操作均为阻塞操作,会导致执行线程挂起从而无法执行其他任务,大大降低了CPU的利用率。
3.资源竞争激烈 当增大线程池后其他共享资源可能成为性能瓶颈,如数据库连接资源。会导致多个线程竞争数据库连接,使得数据库连接成为系统瓶颈。
关于Java中怎么实现响应式编程问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款