在HTTPServer中的Executors.newFixedThreadPool中设置可用的处理器

时间:2016-04-13 08:56:14

标签: java multithreading httpserver executors

我正在构建一个需要同时处理多个请求的HTTPServer。

我构建的主要功能如下:

public static void main(String[] args) throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
    server.createContext("/", new MyRequestDispatcher());

    server.setExecutor(Executors.newCachedThreadPool());
    server.start();
}

现在我正在考虑这个Executors.newCachedThreadPool()如何处理创建的线程数。正如我已经读到的那样,要创建的线程数量不受限制,如果我同时收到数千个请求,它会创建数千个线程吗?

我正在考虑限制同时创建的线程数,以便在运行它的机器中正确处理。我想到了这样的事情:

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())

目标是仅根据系统中可用的处理器创建给定数量的线程。

这会有用吗?

提前致谢!!

1 个答案:

答案 0 :(得分:4)

是的,它会起作用,而且它是您最常看到的建议。

根据您的具体使用情况,您仍可能需要使用其他号码。

  • 如果您的任务阻塞(例如由于I / O操作),您可能会受益于比可用内核更多的线程。
  • 如果您可以为每个核心运行多个硬件线程,那么您可能还会获得比可用核心更多的线程。例如,启用超线程的Intel x86 Xeon可以为每个核心运行2个线程,IBM POWER8和Oracle SPARC M7 - 每个核心最多8个线程。
  • 如果您正在运行并发GC收集器,您会遇到严重的GC压力,并且您有一个不间断运行的线程池,您可能会发现稍微减少池中的线程数可以使您处于更甜蜜的位置。这是一个相当具体的例子,我提到这个例子,因为这是我目前正在研究的系统中的一个重大启示。