最近对线程池和IO多路复用又一些新的理解, 简单记录下
线程池与IO多路复用
线程池的技术比较简单,在java中,设置核心线程数,最大线程数,然后提交运行即可,线程池对外是异步的,但是在线程池内部,还是阻塞执行的,当有任何一个线程执行的任务遇到异常情况阻塞时,在高并发的情况下,会对整体造成影响。
这里提一下io多路复用,一般说的io多路复用,是指操作系统而言,对于io的处理,有select,poll,epoll等方法,但是这里说的是指在应对io密集型任务时的线程模型,最常见的就是netty的reactor线程模型,核心就是有一个selector进行任务的接收分发,然后具体任务由线程池进行执行,但是不一样的是,每个执行的
任务由回调控制,可以及时通知状态,这样线程池就可以增大,容纳更多的线程同时执行。比较典型的应用见okHttp的实现http2Connection,对于每一个链接内部可以开始多个stream进行数据传输,然后内部会启动一个ReaderRunnable线程,轮询链接喜爱所有stream的响应结果,然后激活对应线程。
线程池和IO多路复用按理说不是放在一起讨论的,但是很多时候,我们在cpu密集和io密集的场景中都是简单的将任务放到线程池后就不管了,认为并发执行可以解决一切,但是对于部分IO密集的场景,仅仅使用并发不能解决所有问题,这个时候就需要使用io复用结合起来,okhttp就是一个很好的例子。