From 5c1034022277e0d41a4b2c577cd7a4651cd5a6ad Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Tue, 22 Sep 2020 13:35:23 -0700 Subject: [PATCH] Added support for initial capacity pre-init to Pool --- core/src/com/riiablo/logger/Logger.java | 2 +- .../logger/message/PooledFormattedMessage.java | 2 +- .../message/PooledParameterizedMessage.java | 4 ++-- core/src/com/riiablo/util/Pool.java | 16 +++++++++++++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/core/src/com/riiablo/logger/Logger.java b/core/src/com/riiablo/logger/Logger.java index 2e0ca2fb..fc52adb8 100644 --- a/core/src/com/riiablo/logger/Logger.java +++ b/core/src/com/riiablo/logger/Logger.java @@ -9,7 +9,7 @@ import com.riiablo.util.Pool; public final class Logger { private static final String FQCN = Logger.class.getName(); - private static final Pool POOL = new Pool(true, true) { + private static final Pool POOL = new Pool(true, true, 512, Integer.MAX_VALUE) { @Override protected LogEvent newInstance() { return new LogEvent(); diff --git a/core/src/com/riiablo/logger/message/PooledFormattedMessage.java b/core/src/com/riiablo/logger/message/PooledFormattedMessage.java index 744efeb9..d613db2d 100644 --- a/core/src/com/riiablo/logger/message/PooledFormattedMessage.java +++ b/core/src/com/riiablo/logger/message/PooledFormattedMessage.java @@ -7,7 +7,7 @@ import java.util.Locale; import com.riiablo.util.Pool; public class PooledFormattedMessage implements Message { - static final Pool POOL = new Pool(true, true) { + static final Pool POOL = new Pool(true, true, 256, Integer.MAX_VALUE) { @Override protected PooledFormattedMessage newInstance() { return new PooledFormattedMessage(); diff --git a/core/src/com/riiablo/logger/message/PooledParameterizedMessage.java b/core/src/com/riiablo/logger/message/PooledParameterizedMessage.java index ed1935bf..890a991b 100644 --- a/core/src/com/riiablo/logger/message/PooledParameterizedMessage.java +++ b/core/src/com/riiablo/logger/message/PooledParameterizedMessage.java @@ -6,7 +6,7 @@ import com.riiablo.util.Pool; public class PooledParameterizedMessage implements Message { private static final int MAX_BUFFER_SIZE = 255; - private static final Pool BUFFER_POOL = new Pool(true, true) { + private static final Pool BUFFER_POOL = new Pool(true, true, 256, Integer.MAX_VALUE) { @Override protected StringBuilder newInstance() { return new StringBuilder(MAX_BUFFER_SIZE); @@ -26,7 +26,7 @@ public class PooledParameterizedMessage implements Message { BUFFER_POOL.release(buffer); } - static final Pool POOL = new Pool(true, true) { + static final Pool POOL = new Pool(true, true, 256, Integer.MAX_VALUE) { @Override protected PooledParameterizedMessage newInstance() { return new PooledParameterizedMessage(); diff --git a/core/src/com/riiablo/util/Pool.java b/core/src/com/riiablo/util/Pool.java index 08ad6802..01e7cd4c 100644 --- a/core/src/com/riiablo/util/Pool.java +++ b/core/src/com/riiablo/util/Pool.java @@ -19,8 +19,16 @@ public abstract class Pool { this(threadSafe, softReferences, Integer.MAX_VALUE); } - @SuppressWarnings("unchecked") public Pool(boolean threadSafe, boolean softReferences, final int maxCapacity) { + this(threadSafe, softReferences, maxCapacity, 0); + } + + @SuppressWarnings("unchecked") + public Pool(boolean threadSafe, boolean softReferences, final int initialCapacity, final int maxCapacity) { + if (initialCapacity >= maxCapacity) { + throw new IllegalArgumentException("initialCapacity(" + initialCapacity + ") >= maxCapacity(" + maxCapacity + ")"); + } + final Queue queue; if (threadSafe) { queue = new LinkedBlockingQueue(maxCapacity) { @@ -54,6 +62,12 @@ public abstract class Pool { freeObjects = softReferences ? new SoftReferenceQueue<>((Queue>) queue) : queue; + + if (initialCapacity > 0) { + for (int i = 0; i < initialCapacity; i++) { + release(newInstance()); + } + } } protected abstract T newInstance();