1

ノンブロッキング サーバーがあり、次のようになります。

ServerSocketChannel server = ServerSocketChannel.open();
// ... Many stuff like initialise selector, load world, etc
while(server.isOpen())
{
    selector.select();
    Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
    while(iterator.hasNext())
    {
        SelectionKey key = iterator.next();
        switch(key.interestOps())
        {
            case SelectionKey.OP_ACCEPT:
                // .... Accepting, register selector, packet handler etc
                break;
            case SelectionKey.OP_READ:
                // .... Read-write stuff
                break;
        }
        iterator.remove();
    }
}

たとえば、1 つのスレッドで 100 の接続を処理する必要があります。その他の 100 接続は別のスレッドを処理します。私はこのコードでそれをやろうとしました:

public class ConnectionsHandler implements Runnable
{
    private Selector selector;// For each thread gets its own selector

    @Override public void run()
    {
        while(Server.server.isOpen())
        {
            selector.select();
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            while(iterator.hasNext())
            {
                SelectionKey key = iterator.next();
                // .... Read-write stuff
                iterator.remove()
            }
        }
    }
}

しかし、最初に受け入れられた接続がフリーズした後の両方のスレッド...例外はスローされず、単にフリーズします。

4

1 に答える 1