【多线程处理请求】
(1)当前服务器存在的问题:
A、当前服务器程序是单线程,只有一个 main 方法,只有一个主线程在运行
B、当多个用户同时发送请求的时候,服务器在同一时间点只能处理一个请求
C、这样会导致用户排队等待的现象
(2)解决方法:
A、为了让服务器能够同时处理多个请求,可以引入一个线程处理一个请求
B、多线程并发接收用户的请求,请求 A 和请求 B 之间互不干扰,互不等待,在内存角度来说,会有多个栈内存同时运
(3)在 core 包下定义 HandlerRequest 类实现 Runnable 接口,实现 run方法,在 run 方法中处理当前请求
A、因为定义单独的线程处理请求,处理请求时需要客户端套接字对象(一个请求会对应一个客户端套接字对象),所以线程类需要含有客户端套接字对象的引用
private Socket clientSocket = new Socket();
public HandlerRequest(Socket clientSocket){
this.clientSocket = clientSocket;
}
public void run(){
//获取当前线程名称,记录开启线程日志
Logger.log(Thread.currentThread().getName()+”handler request”);
Thread.sleep(1000*60);//处理请求
}
(4)修改 BootStrap.java 在接收到客户端套接字对象之后
A、创建线程对象,将客户端套接字对象传递给该线程
new Thread(new HandlerRequest(clientSocket)).start();
B、*将接收和读取客户端消息的代码注释掉,以后要在 HandlerRequest 中处理
(5)启动服务器,测试服务器是否支持多线程并发处理
注:目前只要用户发送一次请求,则创建一个新的线程,这其实是一种不太好的设计方案,大家有时间可以设计一个线程池,这样可以提高访问效率。