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

标签 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())

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

这行得通吗?

提前致谢!

最佳答案

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

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

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

关于java - 在 HTTPServer 的 Executors.newFixedThreadPool 中设置可用的处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36593323/

相关文章:

java - 如何解决 SQLServerException : Invalid object name?

javascript - 运行 http-server 时出现 ERR_INVALID_REDIRECT

python - 使用 HTTPServer 时如何映射传入的 "path"请求?

python - 如何使用第一个可用端口在 Python 中创建 HTTP 服务器?

java - 为什么 java.lang.Thread 类没有一个只接受 ThreadGroup 的构造函数?

Java:使用字符串作为源代码的一部分

json - 如何使用 Elasticsearch Java API 编写查询,其中 JSON 列表中的元素包含 List<> 中的一些元素?

java - Spring boot API 接受 JSON(强制)和多部分文件(可选)

c# - 等待 IO 的线程会阻塞 CPU 吗?

multithreading - 多线程在单核系统上如何工作?