1、继承Thread,在run()方法中写业务逻辑
public class RequestProcessor extends Thread{
private Socket socket;
private Map<String,HttpServlet> servletMap;
public RequestProcessor(Socket socket, Map<String, HttpServlet> servletMap) {
this.socket = socket;
this.servletMap = servletMap;
}
@Override
public void run() {
try{
Request request = new Request(socket.getInputStream());
Response response = new Response(socket.getOutputStream());
if(servletMap.get(request.getUrl()) == null){
response.outputHtml(request.getUrl());
}else{
HttpServlet httpServlet = servletMap.get(request.getUrl());
httpServlet.service(request,response);
}
socket.close();
}catch (Exception e){
}
}
}
2、使用多线程及线程池
int corePoolSize = 5;
int maximumPoolSize = 20;
long keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(20);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,
unit,workQueue,threadFactory,new ThreadPoolExecutor.AbortPolicy());
public void start() throws IOException {
System.out.println("tomcat 开始启动.......");
loadServlet();
ServerSocket serverSocket = new ServerSocket(port);
//使用多线程
while (true){
Socket socket = serverSocket.accept();
RequestProcessor requestProcessor = new RequestProcessor(socket,servletMap);
requestProcessor.start();
}
//使用线程池
while (true){
socket socket = serverSocket.accept();
threadPoolExecutor.execute(new RequestProcessor(socket,servletMap));
}
}