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

Mig*_*eno 3 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();
}
Run Code Online (Sandbox Code Playgroud)

现在我正在考虑它如何Executors.newCachedThreadPool()在创建的线程数量方面发挥作用。正如我所读到的,要创建的线程数量不受限制,如果我同时收到一千个请求,它会创建一千个线程吗?

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

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
Run Code Online (Sandbox Code Playgroud)

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

这行得通吗?

提前致谢!!

Dim*_*rov 5

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

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

  • 如果您的任务处于阻塞状态(例如,由于 I/O 操作),您可能会受益于比可用内核更多的线程。
  • 如果每个核心可以运行多个硬件线程,那么您还可以从比可用核心更多的线程中受益。例如,启用超线程的 Intel x86 Xeon 可以每个核心运行 2 个线程,IBM POWER8 和 Oracle SPARC M7 – 每个核心最多可以运行 8 个线程。
  • 如果您正在运行并发 GC 收集器,您会经历巨大的 GC 压力,并且您有一个不间断运行的线程池,您可能会发现稍微减少池中的线程数量可以让您处于更有利的位置。不过,这是一个相当具体的例子,我之所以提到它,是因为它对我目前正在开发的系统来说是一个重大启示。