何时以及在阻止ServeSocketChannel时使用选择器的用例是什么? 一般来说,选择器如何在阻塞通道上工作?
答案 0 :(得分:2)
在使用选择器注册之前,通道必须置于非阻塞模式,并且可能不会返回阻止模式,直到它被取消注册。
请参阅register()
:https://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectableChannel.html#register(java.nio.channels.Selector,%20int)
public final SelectionKey register(Selector sel, int ops)
<强>抛出强>:
IllegalBlockingModeException - If this channel is in blocking mode
这就是register()
的样子:
public final SelectionKey register(Selector sel, int ops,
Object att)
throws ClosedChannelException
{
if (!isOpen())
throw new ClosedChannelException();
if ((ops & ~validOps()) != 0)
throw new IllegalArgumentException();
synchronized (regLock) {
if (blocking)
throw new IllegalBlockingModeException();
...
答案 1 :(得分:1)
阻止
ServerSocketChannel
时使用选择器的时间和用途是什么?
没有。它不受支持。
一般来说,选择器如何在阻塞通道上工作?
它没有。当您尝试它时,您将获得IllegalBlockingModeException
。