8

Java NIO は、ノンブロッキング モード (非同期) に設定できるSocketChannelおよびを提供します。ServerSocketChannelほとんどの操作は、成功または操作がまだ完了していないことを示す値を返します。AynchronousSocketChannelコールバック機能とAsynchronousServerSocketChannelは別に、その目的は何ですか?

4

2 に答える 2

6

AynchronousSocketChannelAsynchronousServerSocketChannelは、 CompletionHandlerを受け取るメソッドを使用するときに独自の機能を発揮します。

たとえば、サーバーのコードは次のようになります。

asynchronousServerSocketChannel.accept(Void, new ConnectionHander()); 

クライアント接続を処理するCompletionHandlerConnectionHanderの実装はどこにありますか。

その後、 accept呼び出しを行うスレッドは他の作業を続行でき、NIO API は、クライアント接続が確立されたときにCompletionHandlerへのコールバックのスケジューリングを処理します(これは OS レベルの割り込みだと思います)。

代替コードは次のようになります。

SocketChannel socketChannel = serverSocketChannel.accept();

モードに応じて、呼び出し元のスレッドは、クライアント接続が確立されるか返されるまでブロックされ、pollnullが残ります。どちらの場合も、スレッドを処理しなければならないのはあなたです。これは一般的に、より多くの作業を意味します。

最終的には、特定のユースケースに基づいて選択しますが、私は通常、前者の方がより明確で信頼性の高いコードを生成します。

于 2014-03-04T17:16:54.373 に答える