package com.highcharts.export.pool;
|
|
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
public class BlockingQueuePool<T> extends AbstractPool<T>{
|
|
|
|
LinkedBlockingQueue<T> linkQueue;
|
|
/**
|
|
* @param factory
|
|
* @param number
|
|
* @throws PoolException
|
|
*/
|
|
|
|
public BlockingQueuePool(ObjectFactory<T> factory, int number, int maxWait, long retentionTime) throws PoolException {
|
|
super(factory, number, maxWait, retentionTime);
|
|
queue = new LinkedBlockingQueue<T>();
|
|
linkQueue = (LinkedBlockingQueue<T>) queue;
|
|
}
|
|
|
|
|
|
@Override
|
|
public T borrowObject() throws InterruptedException, PoolException {
|
|
T object = linkQueue.poll(maxWait, TimeUnit.MILLISECONDS);
|
|
if (object == null) {
|
|
throw new PoolException();
|
|
}
|
|
poolSize.getAndDecrement();
|
|
|
|
return object;
|
|
}
|
|
|
|
@Override
|
|
public void returnObject(T object, boolean validate) throws InterruptedException {
|
|
if (object == null) {
|
|
return;
|
|
}
|
|
|
|
boolean valid = ( !validate || objectFactory.validate(object)) ? true : false;
|
|
|
|
if (!valid) {
|
|
destroyObject(object);
|
|
} else {
|
|
objectFactory.passivate(object);
|
|
linkQueue.offer(object, maxWait, TimeUnit.MILLISECONDS);
|
|
poolSize.incrementAndGet();
|
|
}
|
|
}
|
|
|
|
|
|
}
|