温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中怎么实现响应式编程

发布时间:2021-06-30 17:21:28 来源:亿速云 阅读:649 作者:Leah 栏目:大数据

Java中怎么实现响应式编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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中怎么实现响应式编程问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI