java - 在单独线程上处理请求后写入非阻塞 NIO UDP (DatagramChannel) 套接字

标签 java multithreading nio nonblocking

我正在尝试一些网络代码,并且正在尝试找出一种在单独线程上处理事件后触发对 DatagramChannel 的写入的好方法。这对于 TCP 来说非常简单,因为您有一个单独的套接字,您可以在上面注册您的写入兴趣(请参阅 react 器模式等)。然而,对于 UDP,通过数据报 channel 注册和取消注册兴趣效果不太好,因为我基本上只是修改相同的选择键。

我觉得你要么阻塞事件处理程序线程中的发送(错误,因为我们使用阻塞发送),要么阻塞队列或其他东西来获取响应并写入它们(也是错误的,因为我们阻塞选择器线程)。

我想做一些事情,比如一旦有东西要写,就将兴趣切换到写入,然后再次返回读取,但是这样我就冒着竞争的风险,在写入排队后将其设置回读取,然后写入等待直到我得到下一次读取,这也很糟糕。

是的,我知道还有其他可能更适合此类事情的线程模型,但我正在尝试,所以我很好奇。 =)

最佳答案

当你想写的时候,你不必设置要写的interest-ops。只需从您碰巧所在的任何线程中写入即可。只有当该写入返回零时,您才需要担心写入兴趣操作,正如此处的许多答案。

关于java - 在单独线程上处理请求后写入非阻塞 NIO UDP (DatagramChannel) 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49308205/

相关文章:

java - 为什么添加的变量是错误的?

java - 我想在弹出窗口中显示旋转结果而不是 toast

java - 远程 RMI 注册表

ios - 未调用 GTLServiceYouTube executeQuery 回调

java - Netty客户端只使用一个线程

java - ByteBuffer.asCharBuffer() 使用什么字符集?

java - 什么是泽西过滤器?

c# - Thread.Abort() 导致应用程序被杀死

multithreading - 线程在持有锁的情况下可以进行上下文切换吗?

Java - 什么时候释放直接缓冲区?