001 package org.maltparser.core.pool;
002
003 import java.util.HashSet;
004
005 import org.maltparser.core.exception.MaltChainedException;
006
007
008 public abstract class ObjectPoolSet<T> extends ObjectPool<T> {
009 private final HashSet<T> available;
010 private final HashSet<T> inuse;
011
012 public ObjectPoolSet() {
013 this(Integer.MAX_VALUE);
014 }
015
016 public ObjectPoolSet(int keepThreshold) {
017 super(keepThreshold);
018 available = new HashSet<T>();
019 inuse = new HashSet<T>();
020 }
021
022 protected abstract T create() throws MaltChainedException;
023 public abstract void resetObject(T o) throws MaltChainedException;
024
025 public synchronized T checkOut() throws MaltChainedException {
026 if (available.isEmpty()) {
027 T t = create();
028 inuse.add(t);
029 return t;
030 } else {
031 for (T t : available) {
032 inuse.add(t);
033 available.remove(t);
034 return t;
035 }
036 }
037 return null;
038 }
039
040 public synchronized void checkIn(T t) throws MaltChainedException {
041 resetObject(t);
042 inuse.remove(t);
043 if (available.size() < keepThreshold) {
044 available.add(t);
045 }
046 }
047
048 public synchronized void checkInAll() throws MaltChainedException {
049 for (T t : inuse) {
050 resetObject(t);
051 if (available.size() < keepThreshold) {
052 available.add(t);
053 }
054 }
055 inuse.clear();
056 }
057
058 public String toString() {
059 final StringBuilder sb = new StringBuilder();
060 for (T t : inuse) {
061 sb.append(t);
062 sb.append(", ");
063 }
064 return sb.toString();
065 }
066 }