NIO ドメインのサプライヤーとして、私は最新のソフトウェア開発における Java NIO (New I/O) の変革力を直接目撃してきました。 Java NIO は、ネットワーク アプリケーションのパフォーマンスとスケーラビリティを大幅に向上させるノンブロッキング I/O モデルを提供します。 Java NIO のコアコンポーネントの 1 つは、選択キー、これは、利息操作を管理する上で重要な役割を果たします。チャネル。このブログでは、関心のある操作を設定する方法について詳しく説明します。選択キーJava NIO では、この強力な機能を活用するための包括的なガイドが提供されます。
SelectionKey と Interest の操作について
金利操作の設定に入る前に、金利操作とは何かを簡単に理解しましょう。選択キーは。 Java NIO では、選択キーの登録を表すトークンです。選択可能なチャンネルとセレクタ。これには、チャネル、セレクター、およびそのチャネルに対してセレクターが関係する一連の操作に関する情報が含まれます。
関心のある操作は、選択キークラス。これらの定数には次のものが含まれます。
選択キー.OP_READ: チャネルが読み取りの準備ができていることを示します。選択キー.OP_WRITE: チャネルが書き込みの準備ができていることを示します。選択キー.OP_CONNECT: ソケット チャネルが正常に接続されたか、接続に失敗したことを示します。選択キー.OP_ACCEPT: サーバー ソケット チャネルが新しい接続を受け入れる準備ができていることを示します。
セレクターへのチャンネルの登録と初期動作の設定
の対象となる操作を設定するには選択キー、最初のステップは、選択可能なチャンネルとセレクタ。以下は登録例ですサーバーソケットチャネルとセレクタそして最初の関心操作を次のように設定しますOP_ACCEPT:
インポート java.io.IOException;インポート java.net.InetSocketAddress;インポート java.nio.channels.SelectionKey;インポート java.nio.channels.Selector;インポート java.nio.channels.ServerSocketChannel; java.util.Iteratorをインポートします。 java.util.Setをインポートします。 public class NioServerExample { public static void main(String[] args) throws IOException { // セレクターを開きます。 Selector selector = Selector.open(); // サーバーソケットチャネルを開きます ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(新しい InetSocketAddress(8080)); serverSocketChannel.configureBlocking(false); // チャネルをセレクターに登録し、最初の対象操作を設定します。 while (true) { // イベントを待ちます int readyChannels = selector.select(); if (readyChannels == 0) 続行; // 選択されたキーのセットを取得 Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while (keyIterator.hasNext()) {SelectionKeyselectionKey = keyIterator.next(); if (selectionKey.isAcceptable()) { // accept イベントを処理する } keyIterator.remove(); } } } }
この例では、最初にセレクタそしてサーバーソケットチャネル。次に、サーバーソケットチャネルノンブロッキングにして、セレクタを使用して登録する方法。の 2 番目の引数登録するMethod は最初の関心のある操作であり、この場合は次のようになります。OP_ACCEPT。


金利操作の変更
状況によっては、対象の操作を変更する必要がある場合があります。選択キー初期登録後。これを行うには、関心運用の方法選択キークラス。
があると仮定しましょうソケットチャネル最初に登録したのはセレクタ読み取り操作用。後で、書き込み操作も監視したいと思います。関心のある操作を変更する方法は次のとおりです。
インポート java.io.IOException;インポート java.net.InetSocketAddress;インポート java.nio.channels.SelectionKey;インポート java.nio.channels.Selector;インポート java.nio.channels.SocketChannel; java.util.Iteratorをインポートします。 java.util.Setをインポートします。 public class ModifyInterestOpsExample { public static void main(String[] args) throws IOException { セレクター selector = Selector.open();ソケットチャネルソケットチャネル = SocketChannel.open();ソケットチャネル.configureBlocking(false); socketChannel.connect(new InetSocketAddress("localhost", 8080)); // 読み取り操作用のチャネルを登録します。 // 後で、書き込み操作を含むように関心操作を変更します key.interestOps(key.interestOps() | SelectionKey.OP_WRITE); while (true) { int readyChannels = selector.select(); if (readyChannels == 0) 続行; Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while (keyIterator.hasNext()) {SelectionKeyselectionKey = keyIterator.next(); if (selectionKey.isReadable()) { // 読み取りイベントを処理します } if (selectionKey.isWritable()) { // 書き込みイベントを処理します } keyIterator.remove(); } } } }
このコードでは、最初にソケットチャネル読み取り操作用。次に、関心運用関心のある操作を変更するメソッド。現在の関心のある演算との間でビットごとの OR 演算を実行します。OP_WRITE監視対象操作のセットに書き込み操作を追加します。
現在の金利操作の確認
現在の関心のある操作を確認することもできます。選択キーを使用して関心運用引数なしのメソッド。これは、対象の操作の現在の状態に基づいてデバッグや意思決定を行う場合に役立ちます。
SelectionKey キー = ...; int currentInterestOps = key.interestOps(); if ((currentInterestOps & SelectionKey.OP_READ) != 0) { // チャネルは現在読み取り操作のために監視されています }
実際的な考慮事項
の関心のある操作を設定および変更するとき選択キー、留意すべき実用的な考慮事項がいくつかあります。
- パフォーマンス: 対象操作の頻繁な変更は、特にトラフィックの多いアプリケーションでパフォーマンスに影響を与える可能性があります。不必要な変更は最小限に抑えるようにしてください。
- エラー処理注: 対象の操作を変更するときは、チャネルが有効な状態であることを確認してください。たとえば、次のように設定することはできません。
OP_WRITE閉じたチャンネルで。 - スレッドの安全性: 複数のスレッドがアクセスして変更している場合
選択キーおよびその対象の操作では、競合状態を回避するために適切な同期メカニズムを使用する必要があります。
結論
の関心のある操作を設定する選択キーJava における NIO は、高性能ネットワーク アプリケーションを構築するための基本的な側面です。セレクターを使用してチャネルを登録し、初期の対象操作を設定し、必要に応じて変更する方法を理解することで、アプリケーション内の I/O イベントを効果的に管理できます。
NIO サプライヤーとして、当社は Java NIO 開発における幅広いソリューションと専門知識を提供します。当社の製品やサービスについて詳しく知りたい場合、または Java NIO に関連するプロジェクトを開始したい場合は、ぜひご連絡ください。以下のような当社の高度な製品を探索できます。Nio ET5 電気自動車、イノベーションと品質に対する当社の取り組みを示しています。
調達に関するご相談については、お気軽にお問い合わせください。私たちは、Java NIO を使用してネットワーク アプリケーションを次のレベルに引き上げるお手伝いをします。
参考文献
- 「Java NIO」ロン・ヒッチンズ著
- NIO に関する Oracle Java ドキュメント



























































