2

我在 Java 上有通用网络非阻塞套接字库,在默认 JVM 上一切正常,但在 Android 平台上的下一个代码块:

DatagramChannel channel;
. . .
channel.bind(...)
channel.configureBlocking(false);
. . .
channel.register(udpSelector,  SelectionKey.OP_READ | SelectionKey.OP_WRITE);

register() 上的块,执行可以被阻止 20-40 秒或永远,仅与 OP_READ 或仅与 OP_WRITE 相同。

任何提示如何解决?

编辑:Android 2.3 和 Android 4.0.4 上的相同问题

4

1 回答 1

1

这是一个重复的问题。请参阅 导致通道寄存器阻塞的 Java 非阻塞 IO 选择器,其中指出“选择器具有多个记录在案的内部同步级别,并且您都遇到了它们。在调用 register() 之前在选择器上调用 wakeup()。确保如果选择的键为零,则选择循环正常工作,这将在 wakeup() 上发生。”

于 2013-02-25T22:46:31.893 回答