001package org.maltparser.core.pool; 002 003 004import org.maltparser.core.exception.MaltChainedException; 005import org.maltparser.core.helper.HashSet; 006 007 008public 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}