11

我按照我在网上找到的教程,使用 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://localhost:8000/[context]?int="+threadID

在每个客户端运行时,请求似乎以不同的顺序到达服务器,但它们是以串行方式提供的。

如果可能的话,我希望以并行方式处理请求。

例如,是否有可能在单独的线程中运行每个处理程序,如果可以,这是一件好事吗?

还是我应该完全放弃使用 Sun 的轻量级服务器并专注于从头开始构建一些东西?

谢谢你的帮助。

4

2 回答 2

26

正如您在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 的数量。

于 2013-02-06T13:08:19.823 回答
1

您使用了在同一个调用者线程中运行处理程序的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();
}
于 2019-02-25T13:55:37.787 回答