在服务器端用nio或多线程模型都能实现同时服务多个用户的需求。请问什么时候选择多线程模型?什么时候选择nio?选择nio的好处是什么?

解决方案 »

  1.   

    你如果理解NIO的机制, 以及概念
    还有多线程模型的话你自然而然就知道了,
    这些东西没有什么规则的, 具体问题具体分析吧, 有好有坏的。
      

  2.   

    可以根据吞吐规模和并发度来决定。如果是并发度很高,且个体吞吐量小的,那么用nio比较好,这样你就不需要海量的线程数去对付海量的并发量,因为线程创建和线程切换也是有代价的。如果是并发度不高,但个体吞吐量大或者说频密,那么用多线程模型比较好,这样每个连接都有专属线程,服务效率高。
      

  3.   

    每个 Channel 使用一个读线程,可以使用多个写线程进行处理。
      

  4.   

    我觉得写线程也可以用同一个,甚至合并到读线程中,因为Selector也可以侦测OP_WRITE事件,我这里现在就是这么做的,整个应用就是一个线程,处理几千个TCP连接。觉得写线程也可以用同一个,甚至合并到读线程中,因为Selector也可以侦测OP_WRITE事件,我这里现在就是这么做的,整个应用就是一个线程,处理几千个TCP连接。不过多线程同样能卯足这个需求,只是要开一个几千个线程的线程池(如果线程池中的线程数量小于连接数,就会有排队现象,效率就不如nio了),同样可以达到nio同等的效率。所以,这贴中不过,我的主要问题是的主要问题是nio相比多线程模型究竟有什么好处?楼上ldh911说线程开了多的话,线程切换也是要花时间的:
    那么我是不是可以理解为:nio主要是为了减少线程池创建的代价和线程切换的代价而存在的呢(我觉得这样解释可以解释得通nio为什么而存在,为什么会使io效率变高)?
    还有,上面说“如果是并发度不高,但个体吞吐量大或者说频密,那么用多线程模型比较好,这样每个连接都有专属线程,服务效率高”。是不是说“连接都有专属线程”的话,业务逻辑也可以在多个线程中运行了,这样业务逻辑本身的耗时不会成为像nio那样单线程(或线程比较少)的瓶颈了,所以才“服务效率高”呢?
      

  5.   

    多线程,是再内存中执行的(ROM中),你可以理解为多个方法去调用线程主体,那么方法在切换的时候是需要时间的(毫秒级别),如果线程非常多的话那么切换时间就会占据大量时间(毫秒经过上亿此累加也会很长的),那么程序会运行的很慢。
    nio你可以理解为,将多线程所在的内存(ROM)加载到缓冲区(RAM),在RAM中执行效率要比ROM快非常多(将上亿次累加后的时间长度,继续压缩到毫秒级别),那么程序会运行的很快。
    如果你要追求更细致的细节的话,那么请去看硬件的结构。
      

  6.   

    基本理解了,nio避免了开线程的开销和线程切换的开销,所以快速。最近又查了资料,nio还有buffer映射,不用为了每次读写数据进行buffer copy,这也是速度快的另一个原因。但nio编程明显比多线程要复杂,并且如果业务逻辑中的计算量比较大的话,还是要开线程去执行业务逻辑的。我还有一个nio的高级问题,我再开一个高分(100分)帖子问一下大家,谢谢!