Есть ли в Java самонастраивающийся пул потоков?

1

Я не всегда знаю оптимальный размер пула потоков, потому что он зависит от количества ядер и от отношения операций процессора и io, которые работают мои потоки. Без сомнения, я могу профилировать и выбирать оптимальный размер. Также я могу написать свой собственный умный пул, который со временем будет оптимальным. Но прежде чем я это сделаю, есть ли там код или библиотека?

Tnx

  • 0
    Ну, все пулы потоков по умолчанию, которые вы сами не измеряете, имеют довольно нормальные значения по умолчанию; например Executors.newCachedThreadPool() .
  • 1
    Запросы на сторонние ресурсы не по теме; но вы можете использовать Runtime.getRuntime().availableProcessors(); чтобы получить количество ядер.
Показать ещё 3 комментария
Теги:
multithreading

2 ответа

1

Я столкнулся с проблемой, подобной этому.

У меня было произвольное количество жестких задач, связанных с вводом-выводом (Runnables или Callables), которые мне нужно было выполнять в фиксированном временном фрагменте. Это происходит снова и снова на фиксированном интервале. В качестве примера позвольте сказать, что каждые 3000 мс я должен был удостовериться, что могу выполнить 143 задачи, которые были сильно связаны сетевым вводом-выводом.

Я закончил с этим как решение, и, похоже, он работает очень хорошо. В основном я отслеживаю некоторые внутренние показатели для размеров пула и успешных/неудачных задач и задержки. В пределах нескольких итераций достаточно информации, чтобы спрогнозировать ответственные размеры за то, насколько большой должен быть пул, а затем уточнить размер пула оттуда, чтобы постепенно приближаться к минимальному размеру пула, который выполняет цель выполнения в правильные временные рамки.

Я никогда не потрудился обобщить его вне моего конкретного случая использования, но я уверен, что там есть возможность сделать это.

-2

Разве ForkJoinPool не решает вашу проблему?

Из javadoc:

Создает ForkJoinPool с параллелизмом, равным Runtime.availableProcessors()

  • 0
    (не знаю, кто проголосовал, это был не я) ForkJoinPool довольно специализирован; это не обобщенный ThreadPoolExecutor подобный тому, что предоставляется Executors.*
  • 0
    Да ты прав. Я думал, так как Executors.newWorkStealingPool создал ForkJoinPool что он может быть хорошим соответствием
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню