Я не всегда знаю оптимальный размер пула потоков, потому что он зависит от количества ядер и от отношения операций процессора и io, которые работают мои потоки. Без сомнения, я могу профилировать и выбирать оптимальный размер. Также я могу написать свой собственный умный пул, который со временем будет оптимальным. Но прежде чем я это сделаю, есть ли там код или библиотека?
Tnx
Я столкнулся с проблемой, подобной этому.
У меня было произвольное количество жестких задач, связанных с вводом-выводом (Runnables или Callables), которые мне нужно было выполнять в фиксированном временном фрагменте. Это происходит снова и снова на фиксированном интервале. В качестве примера позвольте сказать, что каждые 3000 мс я должен был удостовериться, что могу выполнить 143 задачи, которые были сильно связаны сетевым вводом-выводом.
Я закончил с этим как решение, и, похоже, он работает очень хорошо. В основном я отслеживаю некоторые внутренние показатели для размеров пула и успешных/неудачных задач и задержки. В пределах нескольких итераций достаточно информации, чтобы спрогнозировать ответственные размеры за то, насколько большой должен быть пул, а затем уточнить размер пула оттуда, чтобы постепенно приближаться к минимальному размеру пула, который выполняет цель выполнения в правильные временные рамки.
Я никогда не потрудился обобщить его вне моего конкретного случая использования, но я уверен, что там есть возможность сделать это.
Разве ForkJoinPool не решает вашу проблему?
Из javadoc:
Создает ForkJoinPool с параллелизмом, равным Runtime.availableProcessors()
ForkJoinPool
довольно специализирован; это не обобщенный ThreadPoolExecutor
подобный тому, что предоставляется Executors.*
Executors.newWorkStealingPool
создал ForkJoinPool
что он может быть хорошим соответствием
Executors.newCachedThreadPool()
.Runtime.getRuntime().availableProcessors();
чтобы получить количество ядер.