プログラマメモ2 - programmer no memo2

java.nio.channels.Selector を止める - 忘れないようにメモ  2007/08/29

忘れないようにメモです。時間があるときにまとめたいです。

ネットワークのデータを待ちうけでこんな感じのコードを書いていました。
※適当です。

ServerSocketChannel server;
server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(host, port));
this.selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);


while (isGo) {
int n = this.selector.select();
if (n == 0) {
continue; // Nothing to do
}
Iterator i = selector.selectedKeys().iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel client = server.accept();
parseData(client.socket().getInputStream());
client.close();
}
}
}


で、これを止める方法ですが、
まず
isGoをfalseにします。これでループがとまります。

つぎに、
selectorを起こします。起こしますと
selector.select()が動きだして、ループがとまっているので、whileの外にでます。
そしてつぎに、server.socket().close()にしておしまいです。

ですので、isGo,selectorとserverは外部でもつ必要がありますね。

コードはこんな感じ

isGo = false;
selector.wakeup();
server.socket().close();



多分うまくいきます。うごかしてうまくいったレベルなので、説明できないです。

あとで、調べたいと思います。

: