首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >异步和非阻塞调用?也是在阻塞和同步之间。

异步和非阻塞调用?也是在阻塞和同步之间。
EN

Stack Overflow用户
提问于 2010-04-13 05:12:24
回答 5查看 143.4K关注 0票数 437

异步调用和非阻塞调用之间的区别是什么?也是在阻塞和同步调用之间(请举例说明)?

EN

回答 5

Stack Overflow用户

发布于 2012-09-22 06:42:32

把这个问题放在NIO和NIO的上下文中。2在Java7中,异步IO比非阻塞高级了一步。对于java NIO非阻塞调用,可以通过调用AbstractSelectableChannel.configureBlocking(false)来设置所有通道(SocketChannel、ServerSocketChannel、FileChannel等)。然而,在这些IO调用返回之后,您可能仍然需要控制检查,例如是否以及何时再次读/写等。

例如,

while (!isDataEnough()) {
    socketchannel.read(inputBuffer);
    // do something else and then read again
}

使用java7中的异步api,这些控件可以以更通用的方式实现。两种方法中的一种是使用CompletionHandler。请注意,这两个read调用都是非阻塞的。

asyncsocket.read(inputBuffer, 60, TimeUnit.SECONDS /* 60 secs for timeout */, 
    new CompletionHandler<Integer, Object>() {
        public void completed(Integer result, Object attachment) {...}  
        public void failed(Throwable e, Object attachment) {...}
    }
}
票数 18
EN

Stack Overflow用户

发布于 2010-04-13 05:26:51

非阻塞:此函数在堆栈上不会等待。

异步:在函数调用离开堆栈后,代表该函数调用的工作可能会继续

票数 9
EN

Stack Overflow用户

发布于 2018-03-03 13:15:12

阻塞模型要求发起应用程序在I/O启动时进行阻塞。这意味着不可能同时重叠处理和I/O。同步非阻塞模型允许处理和I/O重叠,但它要求应用程序定期检查I/O的状态。这就留下了异步非阻塞I/O,它允许处理和I/O的重叠,包括I/O完成的通知。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2625493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档