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

Set available processors in Executors.newFixedThreadPool in HTTPServer

我正在构建一个需要同时处理多个请求的 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())

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

这行得通吗?

提前致谢!!

是的,它会起作用,而且这是您最常看到的推荐。

根据您的具体用例,您可能仍想使用不同的号码。

  • 如果您的任务正在阻塞(例如,由于 I/O 操作),您可能会受益于比可用内核更多的线程。
  • 如果您可以 运行 每个内核有多个硬件线程,您还可以从比可用内核更多的线程中获益。例如,启用超线程的 Intel x86 Xeons 可以 运行 每个内核 2 个线程,IBM POWER8 和 Oracle SPARC M7 - 每个内核最多 8 个线程。
  • 如果你是 运行ning 并发 GC 收集器,你会遇到很大的 GC 压力,并且你有一个不间断的 运行ning 线程池,你可能会发现稍微减少线程数在游泳池里可以让你进入一个更甜蜜的地方。不过,这是一个相当具体的例子,我之所以提到它,是因为它对我目前正在处理的系统来说是一个重大启示。