Main.java revision 2ad60cfc28e14ee8f0bb038720836a4696c478ad
1// Copyright 2008 The Android Open Source Project
2
3import java.lang.ref.WeakReference;
4
5/**
6 * Some finalizer tests.
7 *
8 * This only works if System.runFinalization() causes finalizers to run
9 * immediately or very soon.
10 */
11public class Main {
12    private static void snooze(int ms) {
13        try {
14            Thread.sleep(ms);
15        } catch (InterruptedException ie) {
16            System.out.println("Snooze: " + ie.getMessage());
17        }
18    }
19
20    public static WeakReference makeRef() {
21        /*
22         * Make ft in another thread, so there is no danger of
23         * a conservative reference leaking onto the main thread's
24         * stack.
25         */
26
27        final WeakReference[] wimp = new WeakReference[1];
28        Thread t = new Thread() {
29                public void run() {
30                    FinalizerTest ft = new FinalizerTest("wahoo");
31                    wimp[0] = new WeakReference(ft);
32                    ft = null;
33                }
34            };
35
36        t.start();
37
38        try {
39            t.join();
40        } catch (InterruptedException ie) {
41            throw new RuntimeException(ie);
42        }
43
44        return wimp[0];
45    }
46
47    public static String wimpString(final WeakReference wimp) {
48        /*
49         * Do the work in another thread, so there is no danger of a
50         * conservative reference to ft leaking onto the main thread's
51         * stack.
52         */
53
54        final String[] s = new String[1];
55        Thread t = new Thread() {
56                public void run() {
57                    Object ref = wimp.get();
58                    if (ref != null) {
59                        s[0] = ref.toString();
60                    }
61                }
62            };
63
64        t.start();
65
66        try {
67            t.join();
68        } catch (InterruptedException ie) {
69            throw new RuntimeException(ie);
70        }
71
72        return s[0];
73    }
74
75    public static void main(String[] args) {
76        WeakReference wimp = makeRef();
77
78        System.out.println("wimp: " + wimpString(wimp));
79
80        /* this will try to collect and finalize ft */
81        System.out.println("gc");
82        System.gc();
83
84        System.out.println("wimp: " + wimpString(wimp));
85        System.out.println("finalize");
86        System.runFinalization();
87        System.out.println("wimp: " + wimpString(wimp));
88
89        System.out.println("sleep");
90        snooze(1000);
91
92        System.out.println("reborn: " + FinalizerTest.mReborn);
93        System.out.println("wimp: " + wimpString(wimp));
94        System.out.println("reset reborn");
95        System.gc();
96        FinalizerTest.mReborn = FinalizerTest.mNothing;
97        System.out.println("gc + finalize");
98        System.gc();
99        System.runFinalization();
100
101        System.out.println("sleep");
102        snooze(1000);
103
104        System.out.println("reborn: " + FinalizerTest.mReborn);
105        System.out.println("wimp: " + wimpString(wimp));
106    }
107}
108
109