在上一篇文章中,我们使用了单线程和多线程实现HTTP服务器,虽然多线程可以提高吞吐量,但是弊端也不可避免,主要有两方面考虑:
1、线程的开销是很大的
2、5个线程只能同时处理5个请求,剩下的请求会被阻塞挂起
基于这种考虑,我们可以使用队列来实现非阻塞HTTP服务器,性能会提高一大截。
package com.cctv.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Title:
* @BelongProjecet http-demo
* @BelongPackage com.cctv.http
* @Description:
* @Copyright CCTV.com
* @Author: lingchuan
* @Date: 2020-04-27 11:32
*/
public class QueueHttpServer {
public static volatile ConcurrentLinkedQueue<Socket> socketQueue = new ConcurrentLinkedQueue();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
executor.execute(new MultiServer());
}
while (true) {
Socket socket = serverSocket.accept();
socketQueue.add(socket);
}
}
}
class MultiServer implements Runnable {
public MultiServer() {
}
public void run() {
while (true) {
Socket socket = QueueHttpServer.socketQueue.poll();
if (socket == null) {
continue;
}
try {
System.out.println("Thread:" + Thread.currentThread());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = "";
while ((line = bufferedReader.readLine()) != null && line.equals("")) {
}
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("HTTP/1.1 200 OK");
printWriter.println("Content-Type: text/html; charset=UTF-8");
printWriter.println("");
printWriter.println("It's Work!");
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}