package jane.core.map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; import jane.core.Log; final class LRUCleaner { private static final class Singleton { private static final LRUCleaner instance = new LRUCleaner(); } interface Cleanable { void sweep(); } private final ExecutorService cleanerThread; private LRUCleaner() { cleanerThread = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r, "LRUCleanerThread"); t.setDaemon(true); t.setPriority(Thread.NORM_PRIORITY + 1); return t; } }); } static void submit(final AtomicInteger status, final Cleanable c) { if(!status.compareAndSet(0, 1)) return; Singleton.instance.cleanerThread.submit(new Runnable() { @Override public void run() { try { c.sweep(); } catch(Throwable e) { Log.log.error("LRUCleaner fatal exception:", e); } finally { status.set(0); } } }); } }