Установите доступные процессоры в 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, и у вас есть пул потоков без остановок, вы можете обнаружить, что небольшое уменьшение количества потоков в пуле может сдвинуть вас с мертвой точки. Это довольно специфический пример, о котором я упоминаю, потому что это было большим откровением в системе, над которой я сейчас работаю.