Methods Summary |
---|
protected void | createAndAddObject()
Object createdObject = null;
if (_totalNumberOfObjects < _maximumSize) {
Object newObject = _helper.create();
_availableObjects.add(newObject);
_totalNumberOfObjects++;
}
if (null != createdObject) {
notifyWaitingGets();
}
return;
|
private java.lang.Object | getLocallyAvailableObject()
// Locks the container while we check for values.
// That way, we don't simultaneously vend the same object
// to two different requests
synchronized (_availableObjects) {
if (!_availableObjects.isEmpty()) {
int lastPosition = _availableObjects.size() - 1;
return _availableObjects.remove(lastPosition);
}
}
return null;
|
public java.lang.Object | getObject()
Object returnValue = null;
while (null == (returnValue = getLocallyAvailableObject())) {
_creator.askForObject();
waitForAvailableObject();
}
return returnValue;
|
private synchronized void | notifyWaitingGets()
notify();
|
protected void | removeAnObject()
if (_totalNumberOfObjects < _steadyStateSize) {
return;
}
Object objectToRemove = getLocallyAvailableObject();
if (null != objectToRemove) {
_helper.dispose(objectToRemove);
}
|
public void | returnObject(java.lang.Object object)
_returner.validateAndReturn(object);
|
protected void | returnObjectToPool(java.lang.Object object)
if (_helper.isObjectStillValid(object)) {
_availableObjects.add(object);
notifyWaitingGets();
} else {
_helper.dispose(object);
_totalNumberOfObjects--;
}
return;
|
private void | startCreatorThread(java.lang.String poolName)
_creator = new ObjectCreator(this);
Thread creatorThread = new Thread(_creator, poolName + " creation thread");
creatorThread.setPriority(Thread.NORM_PRIORITY - 2);
creatorThread.start();
|
private void | startReturnerThread(java.lang.String poolName)
_returner = new ObjectReturner(this);
Thread returnerThread = new Thread(_returner, poolName + " returner thread");
returnerThread.setPriority(Thread.NORM_PRIORITY + 2);
returnerThread.start();
|
private void | startShrinkingThread(java.lang.String poolName)
_shrinker = new PoolShrinker(this);
Thread shrinkerThread = new Thread(_shrinker, poolName + " shrinking thread");
shrinkerThread.setPriority(Thread.NORM_PRIORITY - 2);
shrinkerThread.start();
|
private synchronized void | waitForAvailableObject()
_shrinker.pause(); // if we have to wait, the pool is at full utilization
try {
wait();
} catch (InterruptedException e) {/*ignored*/
}
_shrinker.resume(); // if we had to wait, the pool is at full utilization
|