我一直在研究java.nio的异步功能,到目前为止,我非常喜欢AsynchronousByteChannel类,因为它允许我为每个读或写操作提供完成回调。这很适合scala的Future类。
现在,我正在尝试与DatagramChannel异步交互。(出于好奇,我正在尝试实现我自己的急流客户端,一些跟踪器使用UDP。)
我现在的目标是从原始签名中找到一种调整当前read和write方法的方法.
def write(src: ByteBuffer): Int
def read(dest: ByteBuffer): Int以斯卡拉期货为导向的签名.
def write(src: ByteBuffer): scala.concurrent.Future[Int]
def read(dest: ByteBuffer): scala.concurrent.Future[Int]查看API并在网上找到示例,并找到了选择器类的方法。据我所知,这就是我需要使用的使DatagramChannel成为“非阻塞”的方法,但我看到了三种似乎相关的方法:
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的方法?如果没有,处理实际阻塞(读为“最小化”)的最佳方法是什么?
发布于 2013-07-09 12:13:29
利用专用的选择器线程根本不是问题。首先,这是不可避免的。其次,AsynchronousByteChannel实现还使用遮罩下的后台线程。
至于使用Selector的最佳方法,我相信我在SelectorThread实现中找到了一种(注意,它仍然在"work“分支中)。我没有在DatagramChannel中尝试它,但它应该能工作:只需以与AsyncSocketChannel1相同的方式实现AsyncDatagramChannel即可。
https://stackoverflow.com/questions/17108955
复制相似问题