<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

    ——?dú)g迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗(yàn),分享JAVA帶來的快樂!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問題請與我聯(lián)系。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

    Java NIO非堵塞應(yīng)用通常適用用在I/O讀寫等方面,我們知道,系統(tǒng)運(yùn)行的性能瓶頸通常在I/O讀寫,包括對端口和文件的操作上,過去,在打開一個(gè)I/O通道后,read()將一直等待在端口一邊讀取字節(jié)內(nèi)容,如果沒有內(nèi)容進(jìn)來,read()也是傻傻的等,這會(huì)影響我們程序繼續(xù)做其他事情,那么改進(jìn)做法就是開設(shè)線程,讓線程去等待,但是這樣做也是相當(dāng)耗費(fèi)資源的。

    Java NIO非堵塞技術(shù)實(shí)際是采取Reactor模式,或者說是Observer模式為我們監(jiān)察I/O端口,如果有內(nèi)容進(jìn)來,會(huì)自動(dòng)通知我們,這樣,我們就不必開啟多個(gè)線程死等,從外界看,實(shí)現(xiàn)了流暢的I/O讀寫,不堵塞了。

    Java NIO出現(xiàn)不只是一個(gè)技術(shù)性能的提高,你會(huì)發(fā)現(xiàn)網(wǎng)絡(luò)上到處在介紹它,因?yàn)樗哂欣锍瘫饬x,從JDK1.4開始,Java開始提高性能相關(guān)的功能,從而使得Java在底層或者并行分布式計(jì)算等操作上已經(jīng)可以和C或Perl等語言并駕齊驅(qū)。

    如果你至今還是在懷疑Java的性能,說明你的思想和觀念已經(jīng)完全落伍了,Java一兩年就應(yīng)該用新的名詞來定義。從JDK1.5開始又要提供關(guān)于線程、并發(fā)等新性能的支持,Java應(yīng)用在游戲等適時(shí)領(lǐng)域方面的機(jī)會(huì)已經(jīng)成熟,Java在穩(wěn)定自己中間件地位后,開始蠶食傳統(tǒng)C的領(lǐng)域。

    本文主要簡單介紹NIO的基本原理,在下一篇文章中,將結(jié)合Reactor模式和著名線程大師Doug Lea的一篇文章深入討論。

    NIO主要原理和適用。

    NIO 有一個(gè)主要的類Selector,這個(gè)類似一個(gè)觀察者,只要我們把需要探知的socketchannel告訴Selector,我們接著做別的事情,當(dāng)有事件發(fā)生時(shí),他會(huì)通知我們,傳回一組SelectionKey,我們讀取這些Key,就會(huì)獲得我們剛剛注冊過的socketchannel,然后,我們從這個(gè)Channel中讀取數(shù)據(jù),放心,包準(zhǔn)能夠讀到,接著我們可以處理這些數(shù)據(jù)。

    Selector內(nèi)部原理實(shí)際是在做一個(gè)對所注冊的channel的輪詢訪問,不斷的輪詢(目前就這一個(gè)算法),一旦輪詢到一個(gè)channel有所注冊的事情發(fā)生,比如數(shù)據(jù)來了,他就會(huì)站起來報(bào)告,交出一把鑰匙,讓我們通過這把鑰匙來讀取這個(gè)channel的內(nèi)容。

    了解了這個(gè)基本原理,我們結(jié)合代碼看看使用,在使用上,也在分兩個(gè)方向,一個(gè)是線程處理,一個(gè)是用非線程,后者比較簡單,看下面代碼:

      1import java.io.*;
      2import java.nio.*;
      3import java.nio.channels.*;
      4import java.nio.channels.spi.*;
      5import java.net.*;
      6import java.util.*
      7/**
      8*
      9@author Administrator
     10@version
     11*/

     12public class NBTest {
     13
     14
     15  /** Creates new NBTest */
     16  public NBTest()
     17  {
     18  }

     19
     20  public void startServer() throws Exception
     21  {
     22  int channels = 0;
     23  int nKeys = 0;
     24  int currentSelector = 0;
     25
     26  //使用Selector
     27  Selector selector = Selector.open();
     28
     29  //建立Channel 并綁定到9000端口
     30  ServerSocketChannel ssc = ServerSocketChannel.open();
     31  InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000); 
     32  ssc.socket().bind(address);
     33
     34  //使設(shè)定non-blocking的方式。
     35  ssc.configureBlocking(false);
     36
     37  //向Selector注冊Channel及我們有愛好的事件
     38  SelectionKey s = ssc.register(selector, SelectionKey.OP_ACCEPT);
     39  printKeyInfo(s);
     40
     41  while(true//不斷的輪詢
     42  {
     43    debug("NBTest: Starting select");
     44
     45    //Selector通過select方法通知我們我們感愛好的事件發(fā)生了。
     46    nKeys = selector.select();
     47    //假如有我們注冊的事情發(fā)生了,它的傳回值就會(huì)大于0
     48    if(nKeys > 0)
     49    {
     50      debug("NBTest: Number of keys after select operation: " +nKeys);
     51
     52      //Selector傳回一組SelectionKeys
     53      //我們從這些key中的channel()方法中取得我們剛剛注冊的channel。
     54      Set selectedKeys = selector.selectedKeys();
     55      Iterator i = selectedKeys.iterator();
     56      while(i.hasNext())
     57      {
     58         s = (SelectionKey) i.next();
     59         printKeyInfo(s);
     60         debug("NBTest: Nr Keys in selector: " +selector.keys().size());
     61
     62         //一個(gè)key被處理完成后,就都被從就緒要害字(ready keys)列表中除去
     63         i.remove();
     64         if(s.isAcceptable())
     65         {
     66           // 從channel()中取得我們剛剛注冊的channel。
     67           Socket socket = ((ServerSocketChannel) s.channel()).accept();
     68           SocketChannel sc = socket.getChannel();
     69
     70           sc.configureBlocking(false);
     71           sc.register(selector, SelectionKey.OP_READ SelectionKey.OP_WRITE);
     72                      System.out.println(++channels);
     73         }

     74         else
     75         {
     76           debug("NBTest: Channel not acceptable");
     77         }

     78      }

     79   }

     80   else
     81   {
     82      debug("NBTest: Select finished without any keys.");
     83   }

     84
     85  }

     86
     87}

     88
     89
     90private static void debug(String s)
     91{
     92  System.out.println(s);
     93}

     94
     95
     96private static void printKeyInfo(SelectionKey sk)
     97{
     98  String s = new String();
     99
    100  s = "Att: " + (sk.attachment() == null ? "no" : "yes");
    101  s += ", Read: " + sk.isReadable();
    102  s += ", Acpt: " + sk.isAcceptable();
    103  s += ", Cnct: " + sk.isConnectable();
    104  s += ", Wrt: " + sk.isWritable();
    105  s += ", Valid: " + sk.isValid();
    106  s += ", Ops: " + sk.interestOps();
    107  debug(s);
    108}

    109
    110
    111/**
    112@param args the command line arguments
    113*/

    114public static void main (String args[])
    115{
    116  NBTest nbTest = new NBTest();
    117  try
    118  {
    119    nbTest.startServer();
    120  }

    121    catch(Exception e)
    122  {
    123    e.printStackTrace();
    124  }

    125}

    126
    127}

    這是一個(gè)守候在端口9000的noblock server例子,如果我們編制一個(gè)客戶端程序,就可以對它進(jìn)行互動(dòng)操作,或者使用telnet 主機(jī)名 90000 可以鏈接上。

    通過仔細(xì)閱讀這個(gè)例程,相信你已經(jīng)大致了解NIO的原理和使用方法,下一篇,我們將使用多線程來處理這些數(shù)據(jù),再搭建一個(gè)自己的Reactor模式。

    posted on 2009-05-31 15:17 rogerfan 閱讀(685) 評論(0)  編輯  收藏 所屬分類: 【Java知識(shí)】
    主站蜘蛛池模板: 久久亚洲熟女cc98cm| 亚洲国产高清在线| 亚洲一区二区三区影院 | AV片在线观看免费| 免费鲁丝片一级在线观看| 亚洲高清无码专区视频| 亚洲AV无码乱码国产麻豆| 亚洲人成在线精品| 免费精品国产自产拍在线观看 | 亚洲av永久无码精品网址| fc2成年免费共享视频网站| 99热这里只有精品免费播放| 在线观看无码的免费网站| 国产精品亚洲美女久久久| 久久精品国产亚洲AV无码麻豆| 亚洲欧洲av综合色无码| 久久精品无码专区免费| 日本免费网站视频www区| 又黄又爽无遮挡免费视频| 亚洲AV中文无码乱人伦下载| 亚洲三级高清免费| a级精品九九九大片免费看| 国产日本一线在线观看免费| 亚洲欧洲自拍拍偷精品 美利坚| 4444亚洲国产成人精品| 免费人成视频在线观看免费| 99视频免费播放| 又大又粗又爽a级毛片免费看| 亚洲视频在线观看一区| 在线观看国产一区亚洲bd| 99爱视频99爱在线观看免费| 免费欧洲毛片A级视频无风险| 亚洲综合精品一二三区在线| 真人无码作爱免费视频| 四虎成年永久免费网站| 中文字幕精品亚洲无线码一区| 亚洲国产精品一区二区三区在线观看 | 白白色免费在线视频| 亚洲一级毛片免费观看| 国产亚洲美女精品久久久| 亚洲一本到无码av中文字幕|