LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1164|回复: 4

luma来看lumaQQ的NIO注册Write事件CPU 100%

[复制链接]
发表于 2005-3-26 14:29:58 | 显示全部楼层 |阅读模式
今天在网上看见一篇文章说:

既然没用就删了吧

不知道对lumq有没有帮助??
 楼主| 发表于 2005-3-26 14:37:15 | 显示全部楼层

好像还一个源代码是这样的

好像还一个源代码是这样的,不知能不能处理这个CPU 100%的问题!我初学,学得不扎实!luma看看。。


/**
* @author lqh
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class NBTest {


        /** Creates new NBTest */
        public NBTest()
        {
        }

        public void startServer() throws Exception
        {
        int channels = 0;
        int nKeys = 0;
        int currentSelector = 0;

        //使用Selector
        Selector selector = Selector.open();

        //建立Channel 并绑定到9000端口
        ServerSocketChannel ssc = ServerSocketChannel.open();
        InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);
        ssc.socket().bind(address);

        //使设定non-blocking的方式。
        ssc.configureBlocking(false);

        //向Selector注册Channel及我们有兴趣的事件
        SelectionKey s = ssc.register(selector, SelectionKey.OP_ACCEPT);
        printKeyInfo(s);

        while(true) //不断的轮询
        {
        debug("NBTest: Starting select");

        //Selector通过select方法通知我们我们感兴趣的事件发生了。
        nKeys = selector.select();
        //如果有我们注册的事情发生了,它的传回值就会大于0
        if(nKeys > 0)
        {
        debug("NBTest: Number of keys after select operation: " +nKeys);

        //Selector传回一组SelectionKeys
        //我们从这些key中的channel()方法中取得我们刚刚注册的channel。
        Set selectedKeys = selector.selectedKeys();
        Iterator i = selectedKeys.iterator();
        while(i.hasNext())
        {
          s = (SelectionKey) i.next();
          printKeyInfo(s);
          debug("NBTest: Nr Keys in selector: " +selector.keys().size());

          //一个key被处理完成后,就都被从就绪关键字(ready keys)列表中除去
          i.remove();
          if(s.isAcceptable())
          {
           // 从channel()中取得我们刚刚注册的channel。
           Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();
           SocketChannel sc = socket.getChannel();

           sc.configureBlocking(false);
           sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
              System.out.println(++channels);
          }
          else
          {
           debug("NBTest: Channel not acceptable");
          }
         }
        }
        else
        {
        debug("NBTest: Select finished without any keys.");
        }

         }

        }


        private static void debug(String s)
        {
         System.out.println(s);
        }


        private static void printKeyInfo(SelectionKey sk)
        {
         String s = new String();

         s = "Att: " + (sk.attachment() == null ? "no" : "yes");
         s += ", Read: " + sk.isReadable();
         s += ", Acpt: " + sk.isAcceptable();
         s += ", Cnct: " + sk.isConnectable();
         s += ", Wrt: " + sk.isWritable();
         s += ", Valid: " + sk.isValid();
         s += ", Ops: " + sk.interestOps();
         debug(s);
        }


        /**
        * @param args the command line arguments
        */
        public static void main (String args[])
        {
         NBTest nbTest = new NBTest();
         try
         {
          nbTest.startServer();
         }
          catch(Exception e)
         {
          e.printStackTrace();
         }
        }

        }
回复 支持 反对

使用道具 举报

发表于 2005-3-26 15:36:50 | 显示全部楼层
你干什么,我又没100%
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-26 16:29:05 | 显示全部楼层
你lumaQQ的 porter中
   // 处理发送,这里没有办法使用sk参数,似乎是NIO的一个bug。如果注册Write事件
   //    则Write事件将会不断触发导致CPU 100%,而且没有找到办法控制,只能这样

handler.processWrite();

如果批量处理好像效率不高
回复 支持 反对

使用道具 举报

发表于 2005-3-26 17:52:55 | 显示全部楼层
我没有批量处理,你从哪里看出来批量处理的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表