2016-04-13 7 views
1

Я создаю HTTPServer, который должен обрабатывать несколько запросов одновременно.Установите доступные процессоры в Executors.newFixedThreadPool в 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

Вы можете, но не обязательно оптимально, если потоки выполняют что-либо, что блокирует - если у вас больше потоков, вы можете выполнять работу, пока блокированные ждут. Вы всегда можете установить ограничение на количество потоков в кэшированном пуле потоков - посмотрите на реализацию 'Executors.newCachedThreadPool()' vs 'Executors.newFixedThreadPool (int)'. –

+0

Спасибо Энди! Я посмотрю на них –

ответ

4

Да, это сработает, и это то, что вы увидите чаще всего.

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

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

Спасибо Dimitar, Что, по-вашему, тогда, если я хочу закодировать его, чтобы иметь «лучшую» производительность в среднем при работе на любой машине? Если я не знаю спецификации, вы думаете, что исполнитель, который я установил в приведенном выше примере, был бы лучшим подходом? –

+0

Короткий ответ: * Да *. Длинный ответ: на этом уровне детализации (нет) даже это рациональное эмпирическое правило весьма спекулятивно. Вы не ожидаете, что лучший подарок для дня рождения друга - это лучший выбор в интернет-опросе «Лучшая свадьба и подарки на день рождения», верно? Тем не менее, чаще всего, 'Runtime.getRuntime(). AvailableProcessors()' как размер пула потоков не является вашей реальной проблемой. Если это так, вам нужно это доказать, затем корень вызывает его, затем найдите решение - и это тема другого обсуждения :) –