packageeasypool;importjava.util.concurrent.ConcurrentLinkedQueue;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concurrent.TimeUnit;public abstract class ObjectPool{private ConcurrentLinkedQueuepool;privateScheduledExecutorService executorService;/*** Creates the pool.
*
*@paramminIdle minimum number of objects residing in the pool*/
public ObjectPool(final intminIdle) {//initialize pool
initialize(minIdle);
}/*** Creates the pool.
*
*@paramminIdle minimum number of objects residing in the pool
*@parammaxIdle maximum number of objects residing in the pool
*@paramvalidationInterval time in seconds for periodical checking of minIdle / maxIdle conditions in a separate thread.
* When the number of objects is less than minIdle, missing instances will be created.
* When the number of objects is greater than maxIdle, too many instances will be removed.*/
public ObjectPool(final int minIdle, final int maxIdle, final longvalidationInterval) {//initialize pool
initialize(minIdle);//check pool conditions in a separate thread
executorService =Executors.newSingleThreadScheduledExecutor();
executorService.scheduleWithFixedDelay(newRunnable()
{
@Overridepublic voidrun() {int size =pool.size();if (size
pool.add(createObject());
}
}else if (size >maxIdle) {int sizeToBeRemoved = size -maxIdle;for (int i = 0; i < sizeToBeRemoved; i++) {
pool.poll();
}
}
}
}, validationInterval, validationInterval, TimeUnit.SECONDS);
}/*** Gets the next free object from the pool. If the pool doesn't contain any objects,
* a new object will be created and given to the caller of this method back.
*
*@returnT borrowed object*/
publicT borrowObject() {
T object;if ((object = pool.poll()) == null) {
object=createObject();
}returnobject;
}/*** Returns object back to the pool.
*
*@paramobject object to be returned*/
public voidreturnObject(T object) {if (object == null) {return;
}this.pool.offer(object);
}/*** Shutdown this pool.*/
public voidshutdown() {if (executorService != null) {
executorService.shutdown();
}
}/*** Creates a new object.
*
*@returnT new object*/
protected abstractT createObject();private void initialize(final intminIdle) {
pool= new ConcurrentLinkedQueue();for (int i = 0; i < minIdle; i++) {
pool.add(createObject());
}
}
}