Что делает CommonsPool2TargetSource, если вы отключаете blockWhenExhausted?

Устаревший CommonPoolTargetSource имел набор поведений, которые можно определить с помощью setWhenExhaustedActionName (). CommonsPool2TargetSource и CommonsPool2 BaseGenericObjectPool, в который он помещается, описывают getBlockWhenExhausted как

Возвращает, блокировать ли при вызове метод loanObject() при исчерпании пула

Я понял это очень много! Что это делает иначе?

Расширяется ли пул, как при установке CommonsPool на "WHEN_EXHAUSTED_GROW", или он просто генерирует исключение? Что просходит?

1 ответ

Решение

Как указано в документации, поведение ObjectPool.borrowObject () при исчерпании зависит от реализации.

Поведение этого метода, когда пул был исчерпан, не строго определено (хотя это может быть определено реализациями).

GenericObjectPool реализация, поставляемая с CommonsPool2, будет блокироваться, если getBlockWhenExhausted() верно и сразу бросай NoSuchElementException иначе. (как задокументировано в GenericObjectPoolborrowObject (long loanMaxWaitMillis))

Если пул исчерпан (нет доступных незанятых экземпляров и нет возможности создавать новые), этот метод либо заблокирует (если BaseGenericObjectPool.getBlockWhenExhausted() истина), либо выдаст исключение NoSuchElementException (если BaseGenericObjectPool.getBlockWhenExhausted() - false). Время, в течение которого этот метод будет блокироваться, когда BaseGenericObjectPool.getBlockWhenExhausted() имеет значение true, определяется значением, переданным параметру loanMaxWaitMillis.

Поведение, подобное "WHEN_EXHAUSTED_GROW", недоступно и, скорее всего, достигается установкой maxTotal в -1 таким образом, бассейн не мог исчерпать вообще.

Другие вопросы по тегам