我已经使用Sun的轻量级HttpServer在线发现了一个简单的HttpServer。
基本上主要功能如下:
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
//Create the context for the server.
server.createContext("/", new BaseHandler());
server.setExecutor(null); // creates a default executor
server.start();
}
我已经实现了BaseHandler接口的方法来处理Http请求并返回响应。
static class BaseHandler implements HttpHandler {
//Handler method
public void handle(HttpExchange t) throws IOException {
//Implementation of http request processing
//Read the request, get the parameters and print them
//in the console, then build a response and send it back.
}
}
我还创建了一个通过线程发送多个请求的客户端。每个线程将以下请求发送到服务器:
的http://本地主机:8000 / [上下文] INT =“+线程ID
在每个客户端运行时,请求似乎以不同的顺序到达服务器,但它们以串行方式提供。
我想要完成的是,如果可能,请以并行方式处理请求。
例如,是否可以在单独的线程中运行每个处理程序,如果是,那么这是一件好事。
或者我应该完全放弃使用Sun的轻量级服务器并从头开始关注建筑物?
感谢您的帮助。
答案 0 :(得分:18)
正如您在ServerImpl中所看到的,默认执行程序只是“运行”任务:
157 private static class DefaultExecutor implements Executor {
158 public void execute (Runnable task) {
159 task.run();
160 }
161 }
你必须为你的httpServer提供一个真正的执行者,如:
server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool());
并且您的服务器将并行运行。 小心,这是一个非限制性的Executor,请参阅Executors.newFixedThreadPool来限制Thread的数量。
答案 1 :(得分:0)
您使用server.setExecutor( null )在同一调用者线程中运行处理程序。在这种情况下,运行服务器的主线程。
您只需要将行更改为
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
//Create the context for the server.
server.createContext("/", new BaseHandler());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
}