第一个写法只是开始调用时将sc的interest set设置成0,最后在任何时刻调用interestOps方法,将interest set改成SelectionKey.OP_READ,
后者是在注册时,直接将interest set设置成了SelectionKey.OP_READ,这两种没多大区别,只是个人觉得第一种灵活性更大!

解决方案 »

  1.   

    sk.interestOps(SelectionKey.OP_READ);
    这句如果在程序里多次出现会不会影响效率.例如在每次接收完数据后都注册
    sk.interestOps(SelectionKey.OP_READ);对程序有没有影响.
    如果只在连接成功时写上SelectionKey another = sc.register(selector,SelectionKey.OP_READ);
    以后就不在注册了,是否可以.
    我的意思就是只注册一次.
    我的想法可以吗?因为我看到有个例子的程序就是每次接收或者发送完都要用interestOps方法去注册,为什么不在最初就把发送和接收都注册上,以后就不再注册了.这样不是更好吗?
    谢谢~
      

  2.   

    AbstractInterruptibleChannel<--SelectableChannel<--AbstractSelectableChannel<--SocketChannel以上是几个类的继承关系!
    其中register(Selector sel, int ops, Object att),register(Selector sel, int ops)两个方法都在SelectableChannel中定义!只不过(Selector sel, int ops, Object att)在SelectableChanel中是一个抽象方法,而register(Selector sel, int ops)是一个具体方法它的方法,该方法实际上就是register(Selector sel, int ops,null),两者效率上看不出差别!
    你可以看看这几个类的源代码,可以看到生成SelectionKey的register方法在注册生成Selection key时没有用到Object att,只是在判断生成的Selection Key是否为空时采用到了Object att!也就是说两种参数register方法注册生成SelecttionKey的效率差不多的!
       至于后面的那种用法我也不是很清楚,如果你想仔细看看两者究竟谁比较好,你可以研究一下它们的源代码!
      

  3.   

    这样只在连接成功时注册一次SelectionKey another = sc.register(selector,SelectionKey.OP_READ);
    与每次接收和发送都注册
    sk.interestOps(SelectionKey.OP_READ);
    到底有没有不同?如果没有不同是不是只要在连接成功时就把SelectionKey.OP_READ与WRITE都注册上(只注册一次),以后无论什么情况都不用interestOps再去注册,是否可以?
      

  4.   

    SelectionKey another = sc.register(selector,SelectionKey.OP_READ);
    比较保险,因为我用NIO这个类写的非阻断的通讯,用这个试用成功,
    但是你上面另外的那个没有测试过,因为觉得没有必要建议你使用这个