package jef.common.pool;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import jef.common.log.LogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 对注册进来的池进行定期释放的线程
* @author jiyi
*
*/
public class ReleaseThread extends Thread {
private static Logger log = LoggerFactory.getLogger(ReleaseThread.class);
private static ReleaseThread prt;
private static final Map<Long,ReleaseThread> threads=new HashMap<Long,ReleaseThread>();
private boolean alive = true;
private long sleep;
private final ConcurrentLinkedQueue<Releasable> pools = new ConcurrentLinkedQueue<Releasable>();
ReleaseThread(long interval){
super();
setDaemon(true);
setName("Pool Release Thread");
this.sleep=interval;
}
public void addPool(Releasable ip) {
pools.add(ip);
if (!isAlive() && alive) {
start();
}
}
public void removePool(Releasable ip) {
logPoolStatic(ip);
pools.remove(ip);
}
public static ReleaseThread getInstance(long interval) {
ReleaseThread r=threads.get(interval);
if(r==null){
r=create(interval);
}
return r;
}
public void close() {
this.alive = false;
}
@Override
public void run() {
while (alive) {
work();
try{
Thread.sleep(sleep);
}catch(InterruptedException e){
LogUtil.exception(e);
}
}
}
private void work() {
for (Releasable pool : pools) {
try {
pool.releaseTillMinSize();
} catch (Exception e) {
log.error("release connecton pool {} error", pool, e);
}
}
}
private synchronized static ReleaseThread create(long interval) {
ReleaseThread r=threads.get(interval);
if(r==null){
r=new ReleaseThread(interval);
if(prt==null){
prt=r;
}
}
return r;
}
public static ReleaseThread getInstance() {
if(prt==null){
return getInstance(3000);
}
return prt;
}
/**
* 正常情況下,關閉時兩者應該相等
* @param pollCount
* @param offerCount
*/
static void logPoolStatic(Releasable re){
PoolStatus status=re.getStatus();
log.info("The pool {} poll-count:{} offer-count:{}",re,status.getPollCount(),status.getOfferCount());
}
}