Установите доступные процессоры в Executors.newFixedThreadPool в 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())

Цель состоит в том, чтобы создать только указанное количество потоков в зависимости от доступных процессоров в системе.

Будет ли это работать?

Заранее спасибо!!

1 ответ

Решение

Да, это будет работать, и это то, что вы увидите, рекомендуется чаще всего.

В зависимости от вашего конкретного варианта использования вы все еще можете использовать другой номер.

  • Если ваши задачи блокируются (например, из-за операций ввода / вывода), вы можете получить больше потоков, чем доступных ядер.
  • Если вы можете запустить несколько аппаратных потоков на одно ядро, вы также можете получить больше потоков, чем доступных ядер. Например, Intel x86 Xeons с включенной функцией Hyperthreading может запускать 2 потока на ядро, IBM POWER8 и Oracle SPARC M7 - до 8 потоков на ядро.
  • Если вы используете параллельные коллекторы GC, испытываете значительное давление GC, и у вас есть пул потоков без остановок, вы можете обнаружить, что небольшое уменьшение количества потоков в пуле может сдвинуть вас с мертвой точки. Это довольно специфический пример, о котором я упоминаю, потому что это было большим откровением в системе, над которой я сейчас работаю.
Другие вопросы по тегам