现在网络服务器一般工作在多线程模式下,主线程负责侦听和接入来自客户端的链接请求,在收到一个连接请求之后转交给另一个线程进行处理,自身继续返回侦听状态。
在如何处理客户端请求方面,有两种选择:1。每当收到请求之后实时地创建一个新线程;2。在服务器启动时便预先创建一批线程,这些线程在空闲时处于等待状态,当接入到一个新请求后,服务器从这些线程中唤醒一个,使其成为工作线程,处理接入的请求。
就第一种来说,创建线程需要消耗一定的资源,具有潜在的不稳定因素。在需要时才创建线程,为服务器整体稳定性带来了隐患。好处是所能响应的客户端请求的数量仅受服务器性能的制约,在服务器能承受的范围之内,都能创建新线程处理客户端的请求。
第二种方式也成为线程池方式。优势是响应请求的速度快,因为工作线程在服务器启动之初便已创建完毕,在需要时只需从线程池中取出即可。
线程池一
下面实例充分的演示线程池的作用,突出线程池处理短请求的特点。客户端请求非常短,只要求服务器从线程池中调度处一个线程,将客户端传给服务器的字符串输出在控制台上。
客户端代码【Commander】
服务器端代码【ThreadManager】
运行结果如下:
客户端控制台:
服务端控制台:
线程池二
本实例演示线程池状态的管理。服务器根据客户端输入的以下指令调度池中的线程。
l report:报告目前线程池中有几个线程处于运行状态。
l pause:线程池中的全部线程进入等待状态。
l step:唤醒处于等待状态的线程中的一个,如果没有任何线程处于等待状态,则不起任何作用。
l run:唤醒全部处于等待状态的线程,如果没有任何线程处于等待状态,则不起任何作用。
l stop:终止全部线程,销毁线程池。
客户端的代码和上面的一样,服务端代码如下:【ThreadManager2】
客户端运行结果如下:
服务端运行结果如下: