ノンブロッキング サーバーがあり、次のようになります。
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()
}
}
}
}
しかし、最初に受け入れられた接続がフリーズした後の両方のスレッド...例外はスローされず、単にフリーズします。