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