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

网站建设公司知名企业台州市建设监理协会网站

网站建设公司知名企业,台州市建设监理协会网站,网站域名申请之后如何做网站,做情趣网站违法吗简介#xff1a; Java异步非阻塞编程的几种方式 一、 从一个同步的Http调用说起 一个很简单的业务逻辑#xff0c;其他后端服务提供了一个接口#xff0c;我们需要通过接口调用#xff0c;获取到响应的数据。 逆地理接口#xff1a;通过经纬度获取这个经纬度所在的省市区… 简介 Java异步非阻塞编程的几种方式 一、 从一个同步的Http调用说起 一个很简单的业务逻辑其他后端服务提供了一个接口我们需要通过接口调用获取到响应的数据。 逆地理接口通过经纬度获取这个经纬度所在的省市区县以及响应的code curl-ihttp://xxx?latitude31.08966221524924channelamap7anearfalselongitude105.13990312814713 {adcode:510722} 服务端执行最简单的同步调用方式 服务端响应之前IO会阻塞在 java.net.SocketInputStream#socketRead0 的native方法上 通过jstack日志可以发现此时这个Thread会一直在runable的状态 main#1 prio5 os_prio31 tid0x00007fed0c810000 nid0x1003 runnable [0x000070000ce14000] java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at java.net.SocketInputStream.read(SocketInputStream.java:171)at java.net.SocketInputStream.read(SocketInputStream.java:141)at org.apache.http.impl.conn.LoggingInputStream.read(LoggingInputStream.java:84)at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282)at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at com.amap.aos.async.AsyncIO.blockingIO(AsyncIO.java:207)....... 线程模型示例 同步最大的问题是在IO等待的过程中线程资源没有得到充分的利用对于大量IO场景的业务吞吐量会有一定限制。 二 、JDK NIO Future 在JDK 1.5 中JUC提供了Future抽象 当然并不是所有的Future都是这样实现的如 io.netty.util.concurrent.AbstractFuture 就是通过线程轮询去。 这样做的好处是主线程可以不用等待IO响应可以去做点其他的比如说再发送一个IO请求可以等到一起返回 main#1 prio5 os_prio31 tid0x00007fd7a500b000 nid0xe03 waiting on condition [0x000070000a95d000] java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method) - parking to wait for 0x000000076ee2d768 (a java.util.concurrent.CountDownLatch$Sync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)at org.asynchttpclient.netty.NettyResponseFuture.get(NettyResponseFuture.java:162)at com.amap.aos.async.AsyncIO.futureBlockingGet(AsyncIO.java:201)..... AsyncHttpClient-2-1#11 prio5 os_prio31 tid0x00007fd7a7247800 nid0x340b runnable [0x000070000ba94000] java.lang.Thread.State: RUNNABLEat sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked 0x000000076eb00ef0 (a io.netty.channel.nio.SelectedSelectionKeySet) - locked 0x000000076eb00f10 (a java.util.Collections$UnmodifiableSet) - locked 0x000000076eb00ea0 (a sun.nio.ch.KQueueSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:693)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)at java.lang.Thread.run(Thread.java:748) 主线程在等待结果返回过程中依然需要等待没有根本解决此问题。 三 、使用Callback回调方式 第二节中依然需要主线程等待获取结果那么可不可以在主线程完成发送请求后再也不用关心这个逻辑去执行其他的逻辑那就可以使用Callback机制。 如此一来主线程再也不需要关心发起IO后的业务逻辑发送完请求后就可以彻底去干其他事情或者回到线程池中再供调度。如果是HttpServer那么需要结合Servlet 3.1的异步Servlet。 使用Callback方式从线程模型中看发现线程资源已经得到了比较充分的利用整个过程中已经没有线程阻塞。 四、 Callback hell 回调地狱当Callback的线程还需要执行下一个IO调用的时候这个时候进入回调地狱模式。 典型的应用场景如通过经纬度获取行政区域adcode逆地理接口然后再根据获得的adcode获取当地的天气信息天气接口。 在同步的编程模型中几乎不会涉及到此类问题。 Callback方式的核心缺陷 五、 JDK 1.8 CompletableFuture 那么有没有办法解决Callback Hell的问题当然有JDK 1.8中提供了CompletableFuture先看看它是怎么解决这个问题的。 将逆地理的Callback逻辑封装成一个独立的CompletableFuture当异步线程回调时调用 future.complete(T) 将结果封装。 将天气执行的Call逻辑也封装成为一个独立的CompletableFuture 完成之后逻辑同上。 compose衔接whenComplete输出 每一个IO操作均可以封装为独立的CompletableFuture从而避免回调地狱。 CompletableFuture只有两个属性 resultFuture的执行结果 (Either the result or boxed AltResult)。stack操作栈用于定义这个Future接下来操作的行为 (Top of Treiber stack of dependent actions)。 weatherFuture这个方法是如何被调用的呢 通过堆栈可以发现是在 reverseCodeFuture.complete(result) 的时候并且也将获得的adcode作为参数执行接下来的逻辑。 这样一来就完美解决回调地狱问题在主的逻辑中看起来像是在同步的进行编码。 六、 Vert.x Future Info-Service中大量使用的 Vert.x Future 也是类似的解决的方案不过设计上使用Handler的概念。 核心执行的逻辑差不多 这当然不是Vertx的全部当然这是题外话了。 七 、Reactive Streams 异步编程对吞吐量以及资源有好处但是有没有统一的抽象去解决此类问题内答案是 Reactive Streams。 核心抽象Publisher Subscriber Processor Subscription 整个包里面只有这四个接口没有实现类。 在JDK 9里面已经被作为一种规范封装到 java.util.concurrent.Flow 一个简单的例子 八、 Reactor Spring 5 Spring WebFlux Flux Mono 作者开发者小助手_LS 原文链接 本文为阿里云原创内容未经允许不得转载
http://www.huolong8.cn/news/284748/

相关文章:

  • 网站开发相关书籍网站定位授权开启权限怎么做
  • 国家工信部网站域名查询系统深圳做企业网站的公司推荐
  • 关键词网站建设公司西安响应式网站建设公司
  • 网站定制分享cpa诱导网站怎么做
  • 优化志愿网站网站开发外键
  • 潍坊哪里做网站网上商城网站建设体会
  • 怎么做网站服务器吗网站备案时间
  • 学校网站模板设计建筑库
  • 怎么样建设一个网站网站后台是怎样制作
  • 网站构建流程做关键词排名卖网站
  • 垂直网站建设规模网站如何免费做SEO优化
  • 李沧建网站公司做网站鼠标移动 链接变颜色
  • 多php网站建设有人找做网站的
  • 兰州建网站的小型电商平台
  • 什么是搜索引擎优化seo重庆seo论
  • 枣阳网站建设等服务九台网站
  • 佛山seo培训机构长沙网站seo公司
  • 做公众号和网站一样吗dw登录页面怎么制作
  • 网站建设怎么引流住房和城乡建设部政务服务平台app
  • 居家养老网站建设wordpress中文标题转换拼音插件
  • 电商在线设计网站百度营稍
  • 电商网站怎么做搜索江西城乡住房建设网站
  • 辽阳内蒙古网站建设网站建设及发展
  • 中国制造网官方网站国际站七牛怎么做网站服务器
  • 网站仿站是啥中国建设银行网站查询密码
  • wordpress网盘主题佛山seo结算
  • 产品网站系统门户网站推广方式
  • 江苏省住房和城乡建设局网站泉山微网站开发
  • 个人网站模板flash网页制作好的官网
  • 淮南家政网站建设地址如何制作微信公众号微商城