This commit is contained in:
Redkale
2021-01-20 18:52:11 +08:00
parent 86fde56129
commit 34156fc092

View File

@@ -39,7 +39,10 @@ public class ObjectPool<T> implements Supplier<T>, Consumer<T> {
protected final Queue<T> queue; protected final Queue<T> queue;
protected ObjectPool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler, Queue<T> queue) { protected final ObjectPool<T> parent;
protected ObjectPool(ObjectPool<T> parent, AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler, Queue<T> queue) {
this.parent = parent;
this.creatCounter = creatCounter; this.creatCounter = creatCounter;
this.cycleCounter = cycleCounter; this.cycleCounter = cycleCounter;
this.creator = creator; this.creator = creator;
@@ -82,7 +85,42 @@ public class ObjectPool<T> implements Supplier<T>, Consumer<T> {
//非线程安全版 //非线程安全版
public static <T> ObjectPool<T> createUnsafePool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) { public static <T> ObjectPool<T> createUnsafePool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return new ObjectPool(creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max), return createUnsafePool(null, creatCounter, cycleCounter, max, creator, prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, Class<T> clazz, Consumer<T> prepare, Predicate<T> recycler) {
return createUnsafePool(parent, 2, clazz, prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, int max, Class<T> clazz, Consumer<T> prepare, Predicate<T> recycler) {
return createUnsafePool(parent, max, Creator.create(clazz), prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return createUnsafePool(parent, 2, creator, prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return createUnsafePool(parent, null, null, max, creator, prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, int max, Supplier<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return createUnsafePool(parent, null, null, max, creator, prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, AtomicLong creatCounter, AtomicLong cycleCounter, int max, Supplier<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return createUnsafePool(parent, creatCounter, cycleCounter, max, c -> creator.get(), prepare, recycler);
}
//非线程安全版
public static <T> ObjectPool<T> createUnsafePool(ObjectPool<T> parent, AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return new ObjectPool(parent, creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max),
creator, prepare, recycler, new ArrayDeque<>(Math.max(Runtime.getRuntime().availableProcessors(), max))); creator, prepare, recycler, new ArrayDeque<>(Math.max(Runtime.getRuntime().availableProcessors(), max)));
} }
@@ -118,7 +156,7 @@ public class ObjectPool<T> implements Supplier<T>, Consumer<T> {
//线程安全版 //线程安全版
public static <T> ObjectPool<T> createSafePool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) { public static <T> ObjectPool<T> createSafePool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<T> creator, Consumer<T> prepare, Predicate<T> recycler) {
return new ObjectPool(creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max), return new ObjectPool(null, creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max),
creator, prepare, recycler, new LinkedBlockingQueue<>(Math.max(Runtime.getRuntime().availableProcessors(), max))); creator, prepare, recycler, new LinkedBlockingQueue<>(Math.max(Runtime.getRuntime().availableProcessors(), max)));
} }
@@ -155,7 +193,8 @@ public class ObjectPool<T> implements Supplier<T>, Consumer<T> {
T result = queue.poll(); T result = queue.poll();
if (result == null) { if (result == null) {
if (creatCounter != null) creatCounter.incrementAndGet(); if (creatCounter != null) creatCounter.incrementAndGet();
result = this.creator.create(); if (parent != null) result = parent.queue.poll();
if (result == null) result = this.creator.create();
} }
if (prepare != null) prepare.accept(result); if (prepare != null) prepare.accept(result);
return result; return result;
@@ -163,7 +202,8 @@ public class ObjectPool<T> implements Supplier<T>, Consumer<T> {
@Override @Override
public void accept(final T e) { public void accept(final T e) {
if (e != null && recycler.test(e)) { if (e == null) return;
if (recycler.test(e)) {
if (cycleCounter != null) cycleCounter.incrementAndGet(); if (cycleCounter != null) cycleCounter.incrementAndGet();
// if (debug) { // if (debug) {
// for (T t : queue) { // for (T t : queue) {
@@ -173,7 +213,7 @@ public class ObjectPool<T> implements Supplier<T>, Consumer<T> {
// } // }
// } // }
// } // }
queue.offer(e); if (!queue.offer(e) && parent != null) parent.accept(e);
} }
} }