--- /dev/null
+import java.lang.ref.*;
+import java.util.HashSet;
+
+class weakref {
+ class OtherThread extends Thread {
+ public volatile boolean quitNow = false;
+ private final ReferenceQueue q;
+ private final HashSet h;
+ public OtherThread(ReferenceQueue q, HashSet h) {
+ this.q = q;
+ this.h = h;
+ }
+ public void run() {
+ while (!quitNow) {
+ try {
+ MyRef r = (MyRef) q.remove();
+ h.remove(r);
+ System.out.println("Integer: " + Integer.toString(r.val));
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ }
+
+ class MyRef extends WeakReference {
+ public final int val;
+ MyRef(Object o, ReferenceQueue q, int val) {
+ super(o, q);
+ this.val = val;
+ }
+ }
+
+ private void test() {
+ System.out.println("This should print a long list of Integers if weak references are working.");
+ ReferenceQueue q = new ReferenceQueue();
+ HashSet h = new HashSet();
+ OtherThread t = new OtherThread(q, h);
+ t.start();
+ for (int i=0; i<1000000; i++) {
+ Object o = new Integer(i);
+ Reference r = new MyRef(o, q, i);
+ h.add(r);
+ }
+ Runtime.getRuntime().gc();
+ try {
+ Thread.sleep(1000);
+ t.quitNow = true;
+ t.interrupt();
+ t.join();
+ } catch (InterruptedException e) {
+ }
+ }
+
+ public static void main(String[] args) {
+ new weakref().test();
+ }
+}
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: java
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */