ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 非阻塞API如何工作?

2019-06-11 11:50:35  阅读:196  来源: 互联网

标签:java asynchronous multithreading nonblocking


我一直在阅读Play Framework documentation并发现这个引用令人困惑:

Note that you may be tempted to therefore wrap your blocking code in
Futures. This does not make it non-blocking, it just means the
blocking will happen in a different thread. You still need to make
sure that the thread pool that you are using has enough threads to
handle the blocking.

我的印象是所有那些非阻塞的lib都在他们自己的线程池中执行阻塞操作并返回Future对象,因此客户端代码不会被阻塞.

但是这句话说它并没有使它无阻塞.我错过了什么吗?是否有一些非阻塞库的高级魔术?

解决方法:

在IO意义上阻塞(如在阻塞IO中)意味着启动IO的线程进入休眠状态,直到IO结果可用.

非阻塞IO(或异步IO)告诉相关驱动程序(内核,数据库驱动程序等)初始化IO操作,然后线程继续执行其他操作.根据您使用的技术,您可以在回调(例如Node.js),渠道(Java),期货(C),承诺(Node.js的较新版本)中处理异步IO结果(可能甚至是异常),任务(.Net),协同程序(C 17)等

异步IO不使用线程使IO异步.这是关键点.向线程池抛出阻塞IO操作不会使其异步,它只是阻塞另一个线程,并且非常不可伸缩.它将使线程池从线程中耗尽,因为它们只会阻塞,因为越来越多的阻塞IO被提交.他们在文档中写道:

The most common place where a typical Play application will block is
when it’s talking to a database. Unfortunately, none of the major
databases provide asynchronous database drivers for the JVM

这意味着大多数数据库实现都没有为Java提供异步IO – 将SQL查询抛出到线程池会使线程池线程阻塞.这就是他们的意思:

Note that you may be tempted to therefore wrap your blocking code in
Futures. This does not make it non-blocking, it just means the
blocking will happen in a different thread.

正如我们之前所说,异步IO不会在另一个线程上阻塞IO.

标准软件包java.nio提供了Java中的Real异步IO的示例

标签:java,asynchronous,multithreading,nonblocking
来源: https://codeday.me/bug/20190611/1218352.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有