/* * Copyright 2004 NAKAMURA Minoru (nminoru@nminoru.jp) */ package jp.nminoru.ref; import java.lang.ref.*; public final class CleanupReference extends PhantomReference { static { System.loadLibrary("CleanupReference"); Thread handler = new ReferenceHandler(); handler.setPriority(Thread.MAX_PRIORITY); handler.setDaemon(true); handler.start(); } private static ReferenceQueue queue = new ReferenceQueue(); private static class ReferenceHandler extends Thread { public void run() { try { for (;;) { Reference r; CleanupReference reference = (CleanupReference)queue.remove(); Object target = reference.get(); if (target != null) { Cleaner cleaner = reference.cleaner; cleaner.clean(target); reference.clear(); } } } catch(InterruptedException e) { } } } Cleaner cleaner; public CleanupReference(Object referent, Cleaner cleaner) { super(referent, queue); this.cleaner = cleaner; } public native Object get(); }