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

时间:2018-03-15 19:59:09

标签: java multithreading nio nonblocking

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

我觉得你要么阻止事件处理程序线程中的发送(错误因为我们正在使用阻塞发送),要么阻塞队列或某些事情以获取响应并写入它们(也是错误因为那时我们'阻止选择器线程)。

我想做一些事情,比如切换兴趣,一旦我有东西要写,然后再回来阅读,但然后我冒着比赛的风险,我把它设置回来读后写排队等待,然后写入等待直到我得到下一次读取,这也很糟糕。

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

1 个答案:

答案 0 :(得分:0)

当你想写时,你不必设置兴趣写作。只需从你碰巧遇到的任何线程中写出。只有当写入返回零时,你才需要担心写入兴趣操作,就像这里的许多答案一样。