Переподписка Java Threadpool - PullRequest
       5

Переподписка Java Threadpool

5 голосов
/ 12 апреля 2011

У меня в основном интенсивная загрузка процессора, которая выполняется в пуле потоков. Операция, однако, имеет определенное количество ожидающих внешних событий, которые не происходят равномерно во времени. Поскольку в Java, насколько мне известно, не существует реализации пула потоков, которая автоматически измеряет число потоков в зависимости от наблюдаемой пропускной способности задачи (как в Microsoft CLR 4), существует, по крайней мере, способ вручную передать пулу потоков увеличить его размер при запуске операции блокировки и уменьшить при завершении?

Например, для 8 ядер размер пула равен 8. Если операция на 100% связана с процессором, просто используйте этот фиксированный пул. Если есть какая-то операция блокировки, нужно уметь это делать:

pool.increase();
waitForSpecialKeyPress();
pool.decrease();

Вот как это делается в асинхронной библиотеке Microsoft C ++: Использование избыточной подписки для задержки смещения

Ответы [ 2 ]

4 голосов
/ 12 апреля 2011

Вы можете расширить ThreadPoolExecutor, добавив свои собственные функции increase() и decrease(), которые выполняют простые setMaximumPoolSize(getMaximumPoolSize() +/- 1).

Обязательно синхронизируйте методы, чтобы случайно не испортить размер пула.

3 голосов
/ 12 апреля 2011

ForkJoinPool в Java 7 имеет ManagedBlocker , который можно использовать для информирования пула о заблокированных потоках, чтобы при необходимости можно было планировать больше потоков.

РЕДАКТИРОВАТЬ: я забыл упомянуть, классы также доступны для Java 6 как jsr166y .

...