方案一:
使用多个thread在执行大量I/O的java程序中是非常重要的。在最简单的情况下,I/O特别是java网络方面的socket的I/O都可能在任何时间点被阻塞住(block住使得后续指令无法被进行),如果用每一个独立的thread去处理自己的I/O在一定程度上,会隔离多个互不相干的I/O操作由于存在阻塞特性(BLOCKING)而相互影响。这意味着你用单一的独立的thread来负责处理单一的你感兴趣的独立的可阻塞的I/O操作。(可阻塞的I/O又叫做“传统的I/O”)
____________________________________________________________
方案二:
方案一并不能在独立的I/O来源的数目迅速膨胀时对系统性能的提高有所帮助,因为无止尽的无限地创建大量thread(线程实例)会让系统由于要维护的thread数量过多而资源耗尽(CPU时间,内存资源耗尽),因此自然地让你想到可以用线程池(thread pool)来解决多独立的数据来源数量膨胀下怎样调度多线程去处理各个独立的I/O,虽然本方案是方案一得升级版但是仍有瑕疵,因为每一个独立的线程可能会因为其处理的I/O具有阻塞特性而使得I/O阻塞的情况下导致线程执行的阻塞,这样导致该线程可能会一直被阻塞的I/O任务所占用,导致系统的可回收的闲置thread较少,从而降低了系统的性能和吞吐量.
________________________________________________________________________
方案三:
因此针对方案二,再次升级,推荐在使用线程池的前提下对于I/O组件的选用尽量选用java提供的nio工具类即无阻塞性质的I/O组件.
这样就解决了I/O的阻塞问题,因为nio工具不会产生阻塞的I/O,使得在使用线程池(thread pool)+NIO(no blocking i/o)的解决方案下,不会出现由于I/O的阻塞所导致的thread执行的阻塞问题,因此这种方案下用多线程去各自独立处理单独的no_blocking_I/O使得系统的性能和吞吐量都有了明显的性能提升!