All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.dongliu.commons.pool.ObjectPool Maven / Gradle / Ivy

There is a newer version: 6.7.0
Show newest version
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