在阻止ServerSocketChannel上使用选择器

时间:2017-08-28 14:01:15

标签: java nio

何时以及在阻止ServeSocketChannel时使用选择器的用例是什么? 一般来说,选择器如何在阻塞通道上工作?

2 个答案:

答案 0 :(得分:2)

这是SelectableChannel javadoc

  

在使用选择器注册之前,通道必须置于非阻塞模式,并且可能不会返回阻止模式,直到它被取消注册。

请参阅register()https://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectableChannel.html#register(java.nio.channels.Selector,%20int)

的javadoc

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