📄 poolgcthread.java
字号:
/*
* Licensed under the X license (see http://www.x.org/terms.htm)
*/
package org.ofbiz.minerva.pool;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;
/**
* Runs garbage collection on all available pools. Only one GC thread is
* created, no matter how many pools there are - it just tries to calculate
* the next time it should run based on the figues for all the pools. It will
* run on any pools which are "pretty close" to their requested time.
*
* @author Aaron Mulder (ammulder@alumni.princeton.edu)
* @version $Revision: 1.2 $
*/
class PoolGCThread extends Thread {
private HashSet pools = new HashSet();
private static Logger log = Logger.getLogger(ObjectPool.class);
PoolGCThread() {
super("Minerva ObjectPool GC Thread");
setDaemon(true);
}
public void run() {
boolean trace = true;
while (true) {
// Don't do anything while there's nothing to do
waitForPools();
if (trace)
log.debug("gc thread waited for pools");
// Figure out how long to sleep
long delay = getDelay();
if (trace)
log.debug("gc thread delay: " + delay);
// Sleep
if (delay > 0l) {
try {
sleep(delay);
} catch (InterruptedException ignored) {
}
}
// Run garbage collection on eligible pools
runGC();
}
}
private synchronized void waitForPools() {
while (pools.size() == 0) {
try {
wait();
} catch (InterruptedException ignored) {
// Warning level seems appropriate; shouldn't really happen
log.warn("waitForPools interrupted");
}
}
}
private synchronized long getDelay() {
long next = Long.MAX_VALUE;
long now = System.currentTimeMillis();
long current;
for (Iterator it = pools.iterator(); it.hasNext();) {
ObjectPool pool = (ObjectPool) it.next();
current = pool.getNextGCMillis(now);
if (current < next)
next = current;
}
return next >= 0l ? next : 0l;
}
private synchronized void runGC() {
boolean trace = true;
if (trace)
log.debug("GC thread running GC");
for (Iterator it = pools.iterator(); it.hasNext();) {
ObjectPool pool = (ObjectPool) it.next();
if (trace)
log.debug("GC Thread pool: " + pool.getName() + ", isTimeToGC(): " + pool.isTimeToGC());
if (pool.isTimeToGC())
pool.runGCandShrink();
}
}
synchronized void addPool(ObjectPool pool) {
if (log.isDebugEnabled())
log.debug("Adding pool: " + pool.getName() + ", GC enabled: " + pool.isGCEnabled());
if (pool.isGCEnabled())
pools.add(pool);
notify();
}
synchronized void removePool(ObjectPool pool) {
if (log.isDebugEnabled())
log.debug("Removing pool: " + pool.getName());
pools.remove(pool);
}
}
/*
vim:tabstop=3:et:shiftwidth=3
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -