Я хотел бы реализовать пул потоков в Java, который может динамически изменять свой размер в зависимости от вычислительного поведения и поведения ввода-вывода переданных ему задач.
Практически я хочу добиться того же поведения, что и новая реализация пула потоков в C # 4.0
Есть ли уже реализация или я могу добиться такого поведения, используя в основном существующие утилиты параллелизма (например, CachedThreadPool)?
Версия C # выполняет самоинструменты для достижения оптимального использования. Какие инструменты самообучения доступны в Java и какое влияние это оказывает на производительность?
Возможен ли совместный подход, когда задача сигнализирует о своем намерении (например, ввод интенсивной операции ввода-вывода, переход на фазу интенсивной работы ЦП)?
Любые предложения приветствуются.
Редактировать Основано на комментариях:
Целевые сценарии могут быть:
- Локальный просмотр и обработка файлов
- веб-сканирование
- Мультисервисный доступ и агрегация
Проблема CachedThreadPool заключается в том, что он запускает новые потоки, когда все существующие потоки заблокированы - вам нужно установить для него явные границы, но это все.
Например, у меня есть 100 веб-сервисов для доступа подряд. Если я создаю 100 CTP, он запустит 100 потоков для выполнения операции, и тонна множества запросов ввода-вывода и передачи данных обязательно наткнется на ноги друг друга. В случае статического теста я смог бы поэкспериментировать и определить оптимальный размер пула, но я хочу, чтобы он был адаптивно определен и применен таким образом.