Changed reset -> onReturn, added onTake - methods that can be used to define actions when an object is taken-from/returned-to the pool

This commit is contained in:
nathan 2015-09-28 01:40:49 +02:00
parent b599206867
commit e1786ca348
3 changed files with 22 additions and 7 deletions

View File

@ -23,7 +23,15 @@ abstract class PoolableObject<T> {
*/
@SuppressWarnings("UnusedParameters")
public
void reset(T object) {
void onReturn(T object) {
}
/**
* Called when an object is taken from the pool, useful for setting an objects state, for example.
*/
@SuppressWarnings("UnusedParameters")
public
void onTake(T object) {
}

View File

@ -33,7 +33,7 @@ class SafeObjectPool<T> implements ObjectPool<T> {
for (int x = 0; x < size; x++) {
T e = poolableObject.create();
poolableObject.reset(e);
poolableObject.onReturn(e);
this.queue.add(e);
}
}
@ -44,11 +44,14 @@ class SafeObjectPool<T> implements ObjectPool<T> {
return this.queue.take();
}
@SuppressWarnings({"Duplicates", "SpellCheckingInspection"})
@Override
public
T takeUninterruptibly() {
try {
return take();
T take = take();
poolableObject.onTake(take);
return take;
} catch (InterruptedException e) {
return null;
}
@ -57,7 +60,7 @@ class SafeObjectPool<T> implements ObjectPool<T> {
@Override
public
void release(T object) {
poolableObject.reset(object);
poolableObject.onReturn(object);
this.queue.offer(object);
}

View File

@ -43,7 +43,7 @@ class UnsafeObjectPool<T> implements ObjectPool<T> {
for (int x = 0; x < newSize; x++) {
T e = poolableObject.create();
poolableObject.reset(e);
poolableObject.onReturn(e);
objects.offer(e);
}
}
@ -63,14 +63,18 @@ class UnsafeObjectPool<T> implements ObjectPool<T> {
}
}
poolableObject.onTake(poll);
return poll;
}
@SuppressWarnings({"Duplicates", "SpellCheckingInspection"})
@Override
public
T takeUninterruptibly() {
try {
return take();
final T take = take();
poolableObject.onTake(take);
return take;
} catch (InterruptedException e) {
return null;
}
@ -79,7 +83,7 @@ class UnsafeObjectPool<T> implements ObjectPool<T> {
@Override
public
void release(T object) {
poolableObject.reset(object);
poolableObject.onReturn(object);
boolean waiting = objects.peek() == null;
// This could potentially happen due to optimistic calculations by the implementation queue.