Java NIO2非同期チャネルAPIの手引き

Java NIO2非同期チャネルAPIガイド

1. 概要

この記事では、Java 7-asynchronous channel APIsの新しいI / O(NIO2)の主要な追加APIの1つの基礎を探ります。

これは、この特定のトピックをカバーする一連の記事の最初です。

非同期チャネルAPIは、Java 1.4に同梱されていた以前の新しいI / O(NIO)APIを強化したものです。 NIOセレクターについて読むには、this linkに従ってください。

NIO APIのもう1つの機能強化は、新しいファイルシステムAPIです。 このサイトでも、そのfile operationspath operationsの詳細を読むことができます。

プロジェクトでNIO2非同期チャネルを使用するには、必要なクラスがバンドルされているため、java.nio.channelsパッケージをインポートする必要があります。

import java.nio.channels.*;

2. 非同期チャネルAPIのしくみ

非同期チャネルAPIは、既存のjava.nio.channelsパッケージに導入されました。簡単に言えば、クラス名の前にAsynchronousという単語を付けることです。

コアクラスには、AsynchronousSocketChannelAsynchronousServerSocketChannel、およびAsynchronousFileChannelが含まれます。

お気づきかもしれませんが、これらのクラスは標準のNIOチャネルAPIとスタイルが似ています。

また、NIOチャネルクラスで利用できるほとんどのAPI操作は、新しい非同期バージョンでも利用できます。 主な違いは、the new channels enable some operations to be executed asynchronouslyです。

操作が開始されると、非同期チャネルAPIにより、保留中の操作を監視および制御するための2つの選択肢が提供されます。 この操作では、java.util.concurrent.Futureオブジェクトを返すことも、java.nio.channels.CompletionHandlerを渡すこともできます。

3. Futureアプローチ

A Future object represents a result of an asynchronous computation.クライアント接続をリッスンするサーバーを作成する場合、AsynchronousServerSocketChannelで静的open APIを呼び出し、オプションで返されたソケットチャネルをアドレスにバインドします。

AsynchronousServerSocketChannel server
  = AsynchronousServerSocketChannel.open().bind(null);

システムがアドレスを自動割り当てできるように、nullを渡しました。 次に、返されたサーバーSocketChannelacceptメソッドを呼び出します。

Future future = server.accept();

古いIOでServerSocketChannelacceptメソッドを呼び出すと、クライアントから着信接続が受信されるまでブロックされます。 ただし、AsynchronousServerSocketChannelacceptメソッドは、すぐにFutureオブジェクトを返します。

Futureオブジェクトのジェネリック型は、操作の戻り値の型です。 上記の場合、それはAsynchronousSocketChannelですが、操作の最終的な戻り値の型に応じて、IntegerまたはStringである可能性もあります。

Futureオブジェクトを使用して、操作の状態を照会できます。

future.isDone();

基になる操作がすでに完了している場合、このAPIはtrueを返します。 この場合、完了は正常終了、例外、またはキャンセルを意味する場合があることに注意してください。

操作がキャンセルされたかどうかを明示的に確認することもできます。

future.isCancelled();

正常に完了する前に操作がキャンセルされた場合にのみtrueを返します。それ以外の場合は、falseを返します。 キャンセルはcancelメソッドによって実行されます。

future.cancel(true);

呼び出しは、Futureオブジェクトによって表される操作をキャンセルします。 このパラメーターは、操作が開始された場合でも、中断できることを示します。 操作が完了すると、キャンセルできません

計算結果を取得するには、getメソッドを使用します。

AsynchronousSocketChannel client= future.get();

操作が完了する前にこのAPIを呼び出すと、完了するまでブロックされ、操作の結果が返されます。

4. CompletionHandlerアプローチ

Futureを使用して操作を処理する代わりに、CompletionHandlerクラスを使用するコールバックメカニズムがあります。 非同期チャネルを使用すると、操作の結果を消費するために完了ハンドラーを指定できます。

AsynchronousServerSocketChannel listener
  = AsynchronousServerSocketChannel.open().bind(null);

listener.accept(
  attachment, new CompletionHandler() {
    public void completed(
      AsynchronousSocketChannel client, Object attachment) {
          // do whatever with client
      }
    public void failed(Throwable exc, Object attachment) {
          // handle failure
      }
  });

completedコールバックAPIは、I / O操作が正常に完了すると呼び出されます。 操作が失敗した場合、failedコールバックが呼び出されます。

これらのコールバックメソッドは、他のパラメーターを受け入れます。操作と共にタグ付けするのに適していると思われるデータを渡すことができます。 この最初のパラメーターは、コールバックメソッドの2番目のパラメーターとして使用できます。

最後に、明確なシナリオは–異なる非同期操作に同じCompletionHandlerを使用することです。 この場合、結果を処理するときにコンテキストを提供するために各操作にタグを付けると、次のセクションでこれが実際に動作することがわかります。

5. 結論

この記事では、Java NIO2の非同期チャネルAPIの入門的な側面を検討しました。

この記事のすべてのコードスニペットと完全なソースコードを入手するには、GitHub projectにアクセスしてください。