
net.dongliu.commons.pool.ObjectPool Maven / Gradle / Ivy
package net.dongliu.commons.pool;
import javax.annotation.Nonnull;
import java.util.Objects;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* Simple Fix-size Object pool
*
* @author Liu Dong
*/
public class ObjectPool {
private final ArrayBlockingQueue blockingQueue;
private final Supplier supplier;
private final Consumer resetter;
private final Predicate checker;
private final int capacity;
public ObjectPool(int capacity, Supplier supplier, Consumer resetter, Predicate checker) {
this.capacity = capacity;
this.blockingQueue = new ArrayBlockingQueue<>(capacity);
this.supplier = Objects.requireNonNull(supplier);
this.resetter = Objects.requireNonNull(resetter);
this.checker = Objects.requireNonNull(checker);
}
/**
* Get object from pool, or create new one if pool is empty.
*/
@Nonnull
public T accquire() {
T value = blockingQueue.poll();
// pool empty, create new value
if (value != null) {
return value;
}
return createNewValue();
}
private T createNewValue() {
return Objects.requireNonNull(supplier.get());
}
/**
* Return value to object pool
*
* @param value not null
* @return false if object pool is already full, or value is not suitable to return to pool
*/
public boolean release(T value) {
Objects.requireNonNull(value);
if (!checker.test(value)) {
return false;
}
this.resetter.accept(value);
return blockingQueue.offer(value);
}
public int getCapacity() {
return capacity;
}
public int getSize() {
return blockingQueue.size();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy