12333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson/*
22333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  Licensed to the Apache Software Foundation (ASF) under one or more
32333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  contributor license agreements.  See the NOTICE file distributed with
42333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  this work for additional information regarding copyright ownership.
52333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  The ASF licenses this file to You under the Apache License, Version 2.0
62333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  (the "License"); you may not use this file except in compliance with
72333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  the License.  You may obtain a copy of the License at
82333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *
92333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *
112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  Unless required by applicable law or agreed to in writing, software
122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  distributed under the License is distributed on an "AS IS" BASIS,
132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  See the License for the specific language governing permissions and
152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson *  limitations under the License.
162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson */
172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonpackage libcore.java.lang;
192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonimport java.io.ByteArrayOutputStream;
212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonimport java.io.PrintStream;
222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonimport java.util.concurrent.Semaphore;
232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonimport java.util.concurrent.locks.LockSupport;
241a9cff8f68deffd618c5cba1f22f0fb0e396e067Jesse Wilsonimport libcore.java.lang.ref.FinalizationTester;
252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilsonpublic class OldThreadTest extends junit.framework.TestCase {
272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    static class SimpleThread implements Runnable {
292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        int delay;
302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public void run() {
322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            try {
332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                synchronized (this) {
342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    this.notify();
352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    this.wait(delay);
362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            } catch (InterruptedException e) {
382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                return;
392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public SimpleThread(int d) {
442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            if (d >= 0)
452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                delay = d;
462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringL$L() {
502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        ThreadGroup tg = new ThreadGroup("Test Group2");
512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st = new Thread(tg, new SimpleThread(1), "SimpleThread3", 1);
522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue("Constructed incorrect thread", (st.getThreadGroup() == tg)
532333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                && st.getName().equals("SimpleThread3"));
542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.start();
552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            st.join();
572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (InterruptedException e) {
582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        tg.destroy();
602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            new Thread(tg, new SimpleThread(1), "SimpleThread3",
632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    Integer.MAX_VALUE);
642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("StackOverflowError/OutOfMemoryError is not thrown.");
652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(IllegalThreadStateException itse) {
662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            //expected
672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_dumpStack() {
722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            PrintStream savedErr = System.err;
742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            ByteArrayOutputStream baos = new ByteArrayOutputStream();
752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            System.setErr(new PrintStream(baos));
762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.dumpStack();
772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            System.setErr(savedErr);
782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            String s = new String(baos.toByteArray());
802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            assertTrue(s.contains("java.lang.Thread.dumpStack"));
822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(Exception e) {
842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected exception was thrown: " + e.toString());
852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    class MonitoredClass {
892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public synchronized void enterLocked() {
902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            boolean b = Thread.holdsLock(this);
912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            assertTrue("Thread should hold lock for object", b);
922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public void enterNonLocked() {
952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            boolean b = Thread.holdsLock(this);
962333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            assertFalse("Thread should not hold lock for object", b);
972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
1002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    boolean wasInterrupted = false;
1022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_joinWithSpuriousInterruption() throws InterruptedException {
1042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        final Thread parker = new Thread() {
1052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            @Override
1062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
1072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                for (int i = 0; i < 10; i++) {
1082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    // we used to get spurious wakeups upon unparking
1092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    LockSupport.park();
1102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
1112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
1122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
1132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread unparker = new Thread() {
1142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            @Override
1152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
1162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                for (int i = 0; i < 10; i++) {
1172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    try {
1182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                        Thread.sleep(100);
1192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                        LockSupport.unpark(parker);
12038db242d16a5a31fd86c519b817ae94c5fc89417Elliott Hughes                    } catch (InterruptedException expected) {
1212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    }
1222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
1232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
1242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
1252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        long startNanos = System.nanoTime();
1272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        parker.start();
1282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        unparker.start();
1292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        parker.join(500, 500000);
1302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        long netWaitTime = System.nanoTime() - startNanos;
1312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue("Expected to wait at least 500000000ns, but was " + netWaitTime + "ns",
1322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                netWaitTime > 500000000);
1332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
1342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_setContextClassLoader() {
1362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        ClassLoader pcl = new ClassLoader() {};
1372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st = new Thread();
1382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.setContextClassLoader(pcl);
1392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertEquals(pcl, st.getContextClassLoader());
1402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.setContextClassLoader(null);
1422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertNull(st.getContextClassLoader());
1432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
1442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_setDaemonZ() {
1462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st = new Thread(new SimpleThread(5));
1472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.start();
1482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
1492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            st.setDaemon(false);
1502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("setDaemon() must throw exception for started thread");
1512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (IllegalThreadStateException ex) {
1522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            // We expect this one.
1532333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
1542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
1552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    private Thread launchFiveSecondDummyThread() {
1572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread thread = new Thread() {
1582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
1592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                try {
1602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    Thread.sleep(5000);
1612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                } catch (InterruptedException e) {
1622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    // Ignore
1632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
1642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
1652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
1662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        thread.start();
1682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        return thread;
1702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
1712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    /**
173229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.lang.Thread#sleep(long)
1742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson     */
1752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_sleepJ() {
1762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        // Note: Not too much we can test here that can be reliably measured.
1772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        // Check that basic behavior is about right (with some tolerance)
1792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        long stime = System.currentTimeMillis();
1802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
1822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.sleep(1000);
1832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (InterruptedException e) {
1842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected InterruptedException was thrown");
1852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
1862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        long ftime = System.currentTimeMillis();
1882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue("Failed to sleep long enough", (ftime - stime) >= 500);
1902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue("Failed to wake up early enough", (ftime - stime) <= 1500);
1912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
1922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        // Check that interrupt works
1932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st = new Thread() {
1942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
1952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                try {
1965e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer                    sleep(1000);
1972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                } catch(InterruptedException ie) {
1982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    wasInterrupted = true;
1992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
2002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
2012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
2022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.start();
2042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
2065e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer            Thread.sleep(500);
2072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(InterruptedException e) {
2082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected InterruptedException was thrown");
2092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.interrupt();
2122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
2145e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer            Thread.sleep(500);
2152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(InterruptedException e) {
2162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected InterruptedException was thrown");
2172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue(wasInterrupted);
2202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
2212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_sleepJI() {
2232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        // Note: Not too much we can test here that can be reliably measured.
2242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        // Check that basic behavior is about right (with some tolerance)
2262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        long stime = System.currentTimeMillis();
2272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
2292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.sleep(1000, 99999);
2302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (InterruptedException e) {
2312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected InterruptedException was thrown");
2322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        long ftime = System.currentTimeMillis();
2352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue("Failed to sleep long enough", (ftime - stime) >= 500);
2372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue("Failed to wake up early enough", (ftime - stime) <= 1500);
2382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        // Check that interrupt works
2402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st = new Thread() {
2412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
2422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                try {
2435e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer                    sleep(1000, 9999);
2442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                } catch(InterruptedException ie) {
2452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    wasInterrupted = true;
2462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
2472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
2482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
2492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.start();
2512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
2535e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer            Thread.sleep(500, 9999);
2542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(InterruptedException e) {
2552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected InterruptedException was thrown");
2562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        st.interrupt();
2592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
2615e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer            Thread.sleep(500);
2622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(InterruptedException e) {
2632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("Unexpected InterruptedException was thrown");
2642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertTrue(wasInterrupted);
2672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
2682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_yield() {
2702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Counter [] countersNotYeld = new Counter[10];
2722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        for(int i = 0; i < 10; i++) {
2742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            countersNotYeld[i] = new Counter(false);
2752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Counter countersYeld = new Counter(true);
2772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
2785e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer            Thread.sleep(1100);
2792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(InterruptedException ie) {}
2802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        for(Counter c:countersNotYeld) {
2822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            assertTrue(countersYeld.counter == c.counter);
2832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
2852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    class Counter extends Thread {
2872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public int counter = 0;
2882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        boolean isDoYield = false;
2892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public Counter(boolean isDoYield) {
2912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            this.isDoYield = isDoYield;
2922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            start();
2932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
2942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
2952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        public void run() {
2965e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer            for(int i = 0; i < 1000; i++) {
2972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                if(isDoYield)
2982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    yield();
2992333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                counter ++;
3002333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
3012333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
3022333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
3032333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
305b399b7edb2bc977a4d31efc9c159d35f277b9bd7Jesse Wilson    public void test_getState() throws InterruptedException {
3062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread.State state = Thread.currentThread().getState();
3072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertNotNull(state);
3082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertEquals(Thread.State.RUNNABLE, state);
3092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
310436426f45d9c1bd7852f88babf595f839e15512aBrian Carlstrom        run = true;
3112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        final Semaphore sem = new Semaphore(0);
3122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        final Object lock = new Object();
3132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread th = new Thread() {
3142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            @Override
3152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
3162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  while (!sem.hasQueuedThreads()) {}
3172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  sem.release();
3182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  // RUNNABLE
3202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  while (run) {}
3212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  try {
3232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      // WAITING
3242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      sem.acquire();
3252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  } catch (InterruptedException e) {
3262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      fail("InterruptedException was thrown.");
3272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  }
3282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  // BLOCKED
3302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  synchronized (lock) {
3312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      lock.equals(new Object());
3322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  }
3332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  synchronized (lock) {
3342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      try {
3352333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                        sem.release();
3362333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3372333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                        // TIMED_WAITING
3382333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                        lock.wait(Long.MAX_VALUE);
3392333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      } catch (InterruptedException e) {
3402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                          // expected
3412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                      }
3422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  }
3432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                  // TERMINATED upon return
3452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
3462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
3472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertEquals(Thread.State.NEW, th.getState());
3482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        th.start();
349b399b7edb2bc977a4d31efc9c159d35f277b9bd7Jesse Wilson        sem.acquire();
3502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertEquals(Thread.State.RUNNABLE, th.getState());
3512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        run = false;
3522333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
353b399b7edb2bc977a4d31efc9c159d35f277b9bd7Jesse Wilson        Thread.sleep(200);
3542333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3552333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertEquals(Thread.State.WAITING, th.getState());
3562333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        synchronized (lock) {
3572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            sem.release();
3582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            long start = System.currentTimeMillis();
3592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            while(start + 1000 > System.currentTimeMillis()) {}
3602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            assertEquals(Thread.State.BLOCKED, th.getState());
3612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
3622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
363b399b7edb2bc977a4d31efc9c159d35f277b9bd7Jesse Wilson        sem.acquire();
3642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        synchronized (lock) {
3662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            assertEquals(Thread.State.TIMED_WAITING, th.getState());
3672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            th.interrupt();
3682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
3692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
370b399b7edb2bc977a4d31efc9c159d35f277b9bd7Jesse Wilson        th.join(1000);
3712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        assertEquals(Thread.State.TERMINATED, th.getState());
3722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
373436426f45d9c1bd7852f88babf595f839e15512aBrian Carlstrom    volatile boolean run;
3742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_holdsLock() {
3762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        MonitoredClass monitor = new MonitoredClass();
3772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        monitor.enterLocked();
3792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        monitor.enterNonLocked();
3802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
3822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.holdsLock(null);
3832333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            fail("NullPointerException was not thrown.");
3842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(NullPointerException npe) {
3852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            //expected
3862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
3872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
3882333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3892333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    @SuppressWarnings("deprecation")
3902333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_stop() {
3912333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread thread = launchFiveSecondDummyThread();
3922333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
3932333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
3942333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.sleep(1000);
3952333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (InterruptedException e) {
3962333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            // Ignore
3972333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
3982333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
399405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        try {
400405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes            thread.stop();
401405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes            fail();
402405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        } catch (UnsupportedOperationException expected) {
403405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        }
4042333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
4052333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4062333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_start() {
4072333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread thr = new Thread();
4082333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        thr.start();
4092333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4102333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            thr.start();
4112333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch(IllegalThreadStateException itse){
4122333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            //expected
4132333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4142333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
4152333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4162333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    @SuppressWarnings("deprecation")
4172333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_stopLjava_lang_Throwable_subtest0() {
4182333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread thread = new Thread() {
4192333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            public void run() {
4202333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                try {
4212333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    Thread.sleep(5000);
4222333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                } catch (InterruptedException e) {
4232333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                    // Ignore
4242333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                }
4252333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            }
4262333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        };
4272333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4282333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        thread.start();
4292333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4302333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.sleep(1000);
4312333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (InterruptedException e) {
4322333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            // Ignore
4332333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4342333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
435405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        try {
436405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes            thread.stop(new Exception("Oops!"));
437405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes            fail();
438405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        } catch (UnsupportedOperationException expected) {
439405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        }
4402333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
4412333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4422333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    @SuppressWarnings("deprecation")
4432333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    public void test_suspend() {
4442333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        Thread thread = launchFiveSecondDummyThread();
4452333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4462333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4472333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            Thread.sleep(1000);
4482333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (InterruptedException e) {
4492333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            // Ignore
4502333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4512333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
452405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        try {
453405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes            thread.suspend();
454405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes            fail();
455405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        } catch (UnsupportedOperationException expected) {
456405d740fa49c15eaf07e6eeb5844a90a256f78efElliott Hughes        }
4572333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
4582333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4592333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    Thread st, ct, spinner;
4602333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4612333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    @Override
4622333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    protected void tearDown() {
4632333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4642333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            if (st != null)
4652333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                st.interrupt();
4662333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (Exception e) {
4672333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4682333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4692333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            if (spinner != null)
4702333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                spinner.interrupt();
4712333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (Exception e) {
4722333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4732333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4742333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            if (ct != null)
4752333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson                ct.interrupt();
4762333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (Exception e) {
4772333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4782333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson
4792333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        try {
4802333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            spinner = null;
4812333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            st = null;
4822333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson            ct = null;
4831a9cff8f68deffd618c5cba1f22f0fb0e396e067Jesse Wilson            FinalizationTester.induceFinalization();
4842333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        } catch (Exception e) {
4852333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson        }
4862333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson    }
4872333d6b20eed39cfac75edaf9643aaf543251537Jesse Wilson}
488