This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user