channel有点类似于stream,它是读写数据的双向通道
,可以从channel将数据读入buffer,也可以将buffer的数据写入channel,而之间文件操作使用的stream要么是输入,要么是输出,channel比stream更为底层。
服务器会为每个客户端创建新的线程与套接字进行会话
内存占用高
线程上下文切换成本高
与cpu有直接关系,cpu线程数表示当前可并行的线程数量,唤醒状态的线程失去cpu时间片段后需要保存当前的线程执行信息(例如指令执行到哪一行等)
只适合连接数少的场景
客户端需要等待线程池有空闲线程时才能继续处理请求
selector的作用就是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非阻塞模式下,不会让线程吊死在一个channel上。适合连接数特别多,但流量低的场景
调用selector的select()
方法会阻塞直到channel发生了读写就绪事件,这些事件发生,select方法就会返回这些事件交给thread来处理