poller クラスのデモコードでは、C の poll(2) API の機能にアクセスする方法を提供します。このコードでは、正常な性能を維持しながら、できるだけの範囲で C の poll(2) API をミラー化します。Java とカーネルの間で入出力オブジェクトの大きな配列をやりとりすることによる影響を受けないように、ポーリングされるファイルやソケットの管理が JNI C コード (または /dev/poll デバイスドライバがある場合はそれ自体) に移されました。 poller クラスデモディレクトリにある README.txt ファイルに、このデモコードの詳しい使い方が記載されています。
Poller Mux = new Poller(); int serverFd = Mux.add(serverSocket, Poller.POLLIN); int fd1 = Mux.add(socket1, Poller.POLLIN); ... int fdN = Mux.add(socketN, Poller.POLLIN); long timeout = 1000; // 1 秒 int numEvents = Mux.waitMultiple(100, fds, revents, timeout); for (int i = 0; i < numEvents; i++) { /* * より洗練させる必要がある */ if (fds[i] == serverFd) { System.out.println("Got new connection."); newSocket = serverSocket.accept(); newSocketFd = Mux.add(newSocket,Poller.POLLIN); } else if (fds[i] == fd1) { System.out.println("Got data on socket1"); socket1.getInputStream().read(byteArray); // fd1 接続の状態に基づいて処理を行う } ... } |