小编use*_*301的帖子

Java 非阻塞 IO 选择器导致通道寄存器阻塞

我有两个线程正在处理用于非阻塞套接字的 Java NIO。这是线程正在做的事情:

线程 1:调用选择器的 select() 方法的循环。如果有任何密钥可用,则相应地处理它们。

线程 2:偶尔会通过调用 register() 向选择器注册一个 SocketChannel。

问题是,除非 select() 的超时时间非常小(比如大约 100 毫秒),否则对 register() 的调用将无限期阻塞。即使通道被配置为非阻塞,并且 javadocs 声明 Selector 对象是线程安全的(但它的选择键不是,我知道)。

所以有人对这个问题有什么想法吗?如果我将所有内容都放在一个线程中,该应用程序就可以完美运行。没有问题发生,但我真的很想有单独的线程。任何帮助表示赞赏。我在下面发布了我的示例代码:

将 select(1000) 更改为 select(100) 它将起作用。将其保留为 select() 或 select(1000) ,它不会。


import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class UDPSocket { private DatagramChannel clientChannel; private String dstHost; private int dstPort; private static Selector recvSelector; private static volatile boolean initialized; private static ExecutorService eventQueue = …

Run Code Online (Sandbox Code Playgroud)

java sockets nonblocking

5
推荐指数
1
解决办法
6710
查看次数

标签 统计

java ×1

nonblocking ×1

sockets ×1