首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.nio DatagramChannel非阻塞模式.你还得挡着吗?

java.nio DatagramChannel非阻塞模式.你还得挡着吗?
EN

Stack Overflow用户
提问于 2013-06-14 12:55:16
回答 1查看 1.2K关注 0票数 0

我一直在研究java.nio的异步功能,到目前为止,我非常喜欢AsynchronousByteChannel类,因为它允许我为每个读或写操作提供完成回调。这很适合scala的Future类。

现在,我正在尝试与DatagramChannel异步交互。(出于好奇,我正在尝试实现我自己的急流客户端,一些跟踪器使用UDP。)

我现在的目标是从原始签名中找到一种调整当前readwrite方法的方法.

代码语言:javascript
复制
def write(src: ByteBuffer): Int
def read(dest: ByteBuffer): Int

以斯卡拉期货为导向的签名.

代码语言:javascript
复制
def write(src: ByteBuffer): scala.concurrent.Future[Int]
def read(dest: ByteBuffer): scala.concurrent.Future[Int]

查看API并在网上找到示例,并找到了选择器类的方法。据我所知,这就是我需要使用的使DatagramChannel成为“非阻塞”的方法,但我看到了三种似乎相关的方法:

代码语言:javascript
复制
select() - blocks until a selection is ready
select(timeout) - blocks until either a selection is ready or timeout is reached
selectNow - doesn't block, but is useless if called before a selection is ready

因此,看来我对“非阻塞”的选择要么是阻塞(wtf?)或者占用一个运行繁忙循环的线程,该循环重复调用其中一个select方法。这是我的问题。

是否有一种使用DatagramChannel实现真正的非阻塞IO的方法?如果没有,处理实际阻塞(读为“最小化”)的最佳方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2013-07-09 12:13:29

利用专用的选择器线程根本不是问题。首先,这是不可避免的。其次,AsynchronousByteChannel实现还使用遮罩下的后台线程。

至于使用Selector的最佳方法,我相信我在SelectorThread实现中找到了一种(注意,它仍然在"work“分支中)。我没有在DatagramChannel中尝试它,但它应该能工作:只需以与AsyncSocketChannel1相同的方式实现AsyncDatagramChannel即可。

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

https://stackoverflow.com/questions/17108955

复制
相关文章

相似问题

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