NIOスレッドモデル
NIOのスレッドモデルとは何ですか?
図NIO上糸モデルは、このスレッドモデルの選択達成、特性に基づいている:チャネルセレクタの複数のスレッドを結合することによって選抜し、このプログラミング・モデルでは、チャネルは、関連するビジネス・ロジックの消費量で存在することが許さタスクは、場合には、このモデルが非ブロックやるので、実行するためにスレッドプールに入れ、論理的な時間のかかるがあるでしょうが、彼は真の非同期プログラミングではなかった、時間のかかる任意の上の任意のチャンネルを操作は、このセレクタを長持ちその後、スレッド全体を下にドラッグし、そしてそれは、ノンブロッキング同期と呼ばれている理由ですます
同期とは何ですか?
- まず:チャネルは、時間のかかる操作で表示されたときに、他のチャネルは、同期のために待たなければならなかったので、
- 第二:ビューのコーディングのポイント:NIOプログラミングサービス側が
select()
関心セレクタイベントの同期を待つことになります - 第三:オペレーティングシステムの観点からは、プログラムがカードからのデータを使用しています - >オペレーティングシステムはバッファカーネル - >ユーザ領域、ユーザ領域のJavaプログラムへのデータは、いわゆる同期に読み書きできるときであります:ユーザ領域に入力されたプロセスデータ、NIOのプログラミングモデルのニーズは、同期と問い続けられます
スレッドモデルのNIOの利点
伝統的なBIOにNIOスレッドスレッドモデルの相対は、最大の利点は、単一のスレッドができ、同時にNユーザー(チャネル)サービス、人々はBIOの場所があるプログラミングモデルを批判しながら、その後、任意の新しい接続でのNIOのスレッドモデルサーバーは、彼は、BIOシステムをそれを実行するために、新しいスレッドよりも、より確実にない非常に高い並行性を開くために持っていました
NIOアプリケーションシナリオ:
NIOアーキテクチャ適切な方法およびそのようなチャットサーバのように、複数の短い(ライト動作)接続の数に接続された、同時アプリケーションを制限しては、より複雑なプログラミングは、JDK1.4をサポートするようになりました
AIO(非同期入力/出力)模型
AIOは何ですか?
AIOがある(jdk1.7)非同期IOプログラミングモデルリリース、真に非同期IO、実現メカニズムのLinuxシステムのepollに基づきます
かどうかはNIO、またはAIOの下部には、これに基づいてネットワーク通信の基本的な手順を変更するのではなく、アップグレードのシリーズされていません
AIO基礎となる実装は、オペレーティング・システムによって行われ、中のデータカーネル空間とユーザ空間の移行は、我々はあまりにも、単にコードを書くときに呼び出すAIO.read()
、またはAIO.write()
することができ、他の言葉で、私たちのビジネスロジックは、コールバックになりました、オペレーティングシステムが思ったときにデータがあるため、このプロセスでは、元のオペレーティングシステムハンドルデータ、ブロック待機中に我々のプログラムのニーズは、あるいはまた、スレッドプール内の実行時に、およびAIOに、違いが省略されたこの待ち時間をプログラミング仕上げに準備ができて、それが私たちのプログラムを妨害しないであろうしない場合は、次に我々は、オペレーティングシステムが完了したと見なさデータに基づいており、彼は私たちのコールバックコールバック機能を提供しますと、他のロジックを処理するためにプログラムすることができます
- データのストリームが読み取られるオペレーティング・システムに対応する、オペレーティング・システムは、バッファ読み出し方法に広げ、その後コールバックCompletionHandlerに関連するであろう
- 書き込み操作の場合、オペレーティングシステムは、データがシステム領域にユーザ空間からバッファを書き込まれ、カードに書かすべきでプログラムを書きます、書き込みが完了すると、それが関連するコールバックコールバック関数にもなります
サーバー側のプログラミング例AIO
次の例AIOは、プログラミング・サーバー側のステッカー:
次の読み取りのように()、ライト())(受け入れるすべて非同期で、すぐに復帰時のコールは、同じ場所ではない、我々は、オペレーティングシステムが所定の位置にデータを読み書きするために考えると、オペレーティングシステムを残して、コールバックオブジェクトを提供しますこれらは、コールバック関数に移動します
public class AIOServer {
private ExecutorService executorService;
// 服务端的Channel
private AsynchronousServerSocketChannel asynchronousServerSocketChannel;
private AIOServer(int port) {
init(port);
}
// 初始化
private void init(int port) {
System.out.println("aio server start with port " + port);
executorService = Executors.newFixedThreadPool(5);
try {
// 开启服务端的通道
asynchronousServerSocketChannel = AsynchronousServerSocketChannel.open();
// 绑定端口
asynchronousServerSocketChannel.bind(new InetSocketAddress(port));
System.out.println("server start ... ");
/**
* 方法会异步的去接收一个请求, accept()同样是
* 参数1 : this , 暂时理解成任意类型的
* 参数2 : CompleteHandler -- 当请求到来后,会交付给 AIOServerHandler进行处理
*
* todo 在 AIO中的监听并不是while(true), 而是类似递归的操作, 每次监听到客户端的请求后, 都需要在处理逻辑中开启下一次的监听
*/
asynchronousServerSocketChannel.accept(this, new AIOServerHandler());
System.out.println("------------------------------");
// 阻塞程序
try {
TimeUnit.SECONDS.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public AsynchronousServerSocketChannel getAsynchronousServerSocketChannel() {
return this.asynchronousServerSocketChannel;
}
public static void main(String[] args) {
AIOServer aioServer = new AIOServer(9999);
}
}
AIO該当シーン
完全同時動作に参加するためにOSを呼び出して、そのようなアルバムサーバとして、より多くの接続数や接続が比較的長い(重い操作)アーキテクチャよりも、使用するAIOの方法は、プログラミングがより複雑で、JDK7がサポートし始めました。
私は歓迎、私は空想の注意を与えるbloger - 武漢の給油を